我接管了一个公司的Java Web应用程序,该应用程序的代码为30k行。系统中有大约20个用户。该应用程序最初做了原始的jdbc sql查询。我已将一些SQL转换为休眠状态,但由于时间和预算限制,我没有将其全部转换。我的想法是,我可以做两个数据库交互方法(休眠和原始jdbc)的混合,而我逐渐将应用程序迁移到所有休眠。它使用c3p0连接池。它使用两个池;一个用于休眠,一个用于原始jdbc查询。有一些原始的jdbc更新和插入查询,但它们现在全部使用hibernate的钩子session.doWork(Work work)
。数据库是Microsoft SQL Server '08 R2。休眠和原始JDBC应用程序混合锁定
我们使用这种方法遇到的问题似乎总是表现为应用程序锁定。在过去一个月里,我通过解决明显的问题,能够减少锁定的频率。我现在正处在一个问题上,原因并不那么明显,我的老板和我怀疑我们的方法或配置有什么根本性的错误可以完全解决这个问题。
一件事是令人困惑我的是,如果这些拘留所是DB死锁,线程转储似乎只是表明写阻塞读。但是,事务隔离级别是读取提交的,那么为什么写块会被读取?
有什么建议可以给你?有更好的调试分析的建议吗?
这里是从我的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" />
我使用的是默认C3P0配置为原始JDBC选择查询
我不确定问题已经解决了,但截至上周,我认为这可能是。上周我们进行了新的应用程序监控。我发现了一些长期运行的交易,这让我想到了更多需要解决的问题。从那以后,该应用程序似乎变得更好了。感谢您的回答! – 2013-05-28 14:38:54