java - Hibernate 和 Raw JDBC 应用程序的混合正在锁定

标签 java hibernate jdbc sql-server-2008-r2

我接手了一家公司的 Java Web 应用程序,该应用程序有 3 万行代码。系统上大约有 20 个用户。该应用程序最初执行原始 jdbc sql 查询。我已经将一些 SQL 转换为 hibernate,但由于时间和预算限制,我没有将其全部转换。我的想法是,我可以混合使用两种数据库交互方法(hibernate 和原始 jdbc),同时我逐步将应用程序迁移到所有 hibernate。它使用 c3p0 连接池。它使用两个游泳池;一种用于 hibernate,另一种用于原始 jdbc 查询。有一些原始的 jdbc 更新和插入查询,但它们现在都使用 hibernate 的 session.doWork(Work work) Hook 。数据库是 Microsoft SQL Server '08 R2。

我们使用这种方法遇到的问题似乎总是表现为应用程序锁定。在过去的一个月里,我已经能够通过修复明显的问题来减少锁定的频率。我现在所处的阶段,原因并不那么明显,我和我的老板怀疑我们的方法或配置存在根本性错误,无法完全解决这个问题。

令我困惑的一件事是,如果这些锁定是数据库死锁,那么线程转储似乎仅表明写入正在阻塞读取。但是,事务隔离级别是读提交,那么为什么写会阻塞读呢?

您有什么建议可以提供吗?对于更好的调试分析有什么建议吗?

这是我的 persistence.xml 文件中的属性

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.c3p0.min_size" value="20" />
<property name="hibernate.c3p0.max_size" value="300" />
<property name="hibernate.c3p0.timeout" value="300" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="3000" />

我对原始 jdbc 选择查询使用默认的 c3p0 配置

最佳答案

我想您现在已经解决了这个问题,但如果没有,您可以查看此链接 http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/transactions.html

您可以首先检查您的应用程序是否没有长期开放的事务。

关于java - Hibernate 和 Raw JDBC 应用程序的混合正在锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844518/

相关文章:

java - 将字符串转换为 javax 邮件消息对象

java - 第一次尝试设置测试数据库但得到 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

java - updateObject 或 changeObject,removeObject 或 deleteObject?

java - 我在通过 Hibernate Search 从数据库获取准确值时遇到问题

java - hibernate 上的触发器(也许这称为拦截器)

java - Hibernate 如何在运行时更改类或对象

java - 我想在JDBC中插入SQL的特殊字符

java - jTable 中的复选框?

Java:如何在 GridLayout 中嵌套 JPanel?

Java Swing 的 GridBagLayout 不会将组件定位在网格单元的顶部