我接管了一家公司的 Java Web 应用程序,该应用程序有 30k 行代码。系统上有大约 20 个用户。该应用程序最初执行原始 jdbc sql 查询。我已经将一些 SQL 转换为休眠状态,但由于时间和预算限制,我没有全部转换。我的想法是我可以混合使用两种 db 交互方法(hibernate 和 raw jdbc),同时将应用程序逐步迁移到所有 hibernate。它使用 c3p0 连接池。它使用两个池;一个用于休眠,一个用于原始 jdbc 查询。有一些原始的 jdbc 更新和插入查询,但它们现在都使用 hibernate 的session.doWork(Work work)
钩子。数据库是 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 配置