【问题标题】:HibernateOptimisticLockingFailureException marks connection as 'closed'?HibernateOptimisticLockingFailureException 将连接标记为“关闭”?
【发布时间】:2012-05-11 12:20:12
【问题描述】:

我得到以下堆栈跟踪:

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 代码中将连接设置为关闭的部分吗?

【问题讨论】:

    标签: spring hibernate exception-handling database-connection optimistic-locking


    【解决方案1】:

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

    但是在使用连接池时,连接并没有真正关闭,当调用 close() 方法时,connection is returned to the pool without physical closing:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 2017-06-13
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多