2

我接管了一家公司的 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 配置

4

2 回答 2

2

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

您可以首先检查您的应用程序没有长期未结交易。

于 2013-05-28T06:08:16.930 回答
0

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

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

现在,为了帮助您,我的问题是:

  • 你能开发新代码吗?如果没有,我建议离开 Hibernate。

如是:

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

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

于 2013-05-28T07:45:46.017 回答