HibernateOptimisticLockingFailureException将连接标记为"已关闭"?

haw*_*eye 6 spring hibernate database-connection exception-handling optimistic-locking

我得到以下堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Sta*_*sev 5

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

但是在使用连接池时,连接不是字面上关闭的,当调用close()方法时,连接将返回到池而不进行物理关闭:

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

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