2013-04-05 41 views
2

我接管了一个公司的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选择查询

回答

2

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

可以通过检查你的应用程序没有长开的交易开始。

+0

我不确定问题已经解决了,但截至上周,我认为这可能是。上周我们进行了新的应用程序监控。我发现了一些长期运行的交易,这让我想到了更多需要解决的问题。从那以后,该应用程序似乎变得更好了。感谢您的回答! – 2013-05-28 14:38:54

0

我认为你的问题是更多的交易和休眠您的代码打开代理对象,也许你有更多的逻辑事务损坏或没有关闭。

Hibernate在从数据库检索到逻辑事务的单个记录上创建代理对象。如果您在另一个事务中更改此记录,或者将这些代理与它们的事务同步,或者hibernate运行更多刷新操作来更新这些代理(如果它们的事务处于打开状态)。

现在,我的问题,来帮助你,是这些:

  • 你可以开发新的代码?如果不是,我建议离开Hibernate。

如果是:

  • 我建议建立一个中间层来管理数据层和所有的代码之间的逻辑事务。

  • 使用一些IDE与JPA 2.0支持创建由数据库逆向工程的对象。