7

我得到以下堆栈跟踪:

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.btfin.wrapcore.request.MFRequest] with identifier [2850448]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.btfin.wrapcore.request.MFRequest#2850448]
  at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:672)
  at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)

这是由于乐观锁定异常。我可以解决这个问题的根本原因。

我的问题是 - 在这种情况下 - 异常处理将数据库连接设置为“关闭”。(这会导致我的连接池出现问题)。

处理数据库异常的模式是什么,比如HibernateOptimisticLockingFailureException通过 spring 和 hibernate 冒泡并返回一个关闭的连接?

您知道 Spring/Hibernate 代码中将连接设置为关闭的部分吗?

4

1 回答 1

6

Hibernate Docs明确指出,如果在使用 Session 时发生任何异常,则以后不能重用 Session。此外,每个 Session 可以包含多个事务,并且在每个事务提交后 - 同样发生,连接被关闭。

但是在使用连接池时,连接并没有真正关闭,当调用 close() 方法时,连接返回池而不物理关闭

当应用程序关闭其连接时,底层物理连接会被回收而不是被关闭。

因此,如果您在物理上关闭连接时遇到问题,我宁愿更多地关注池,而不是 Hibernate 或 Spring——它们只能调用 close() ,这应该像我之前描述的那样工作。

于 2012-05-02T07:43:58.623 回答