我接手了一家公司的 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/