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コードの部分を知っていますか?

4

1 に答える 1

6

Hibernate Docsは、セッションの操作中に例外が発生した場合、セッションを後で再利用することはできないと明確に述べています。さらに、各セッションには複数のトランザクションを含めることができ、各トランザクションがコミットした後、同じことが起こり、接続が閉じられます。

ただし、接続プールを使用している間、接続は文字通り閉じられません。close()メソッドが呼び出されると、接続は物理的に閉じずにプールに返されます

アプリケーションが接続を閉じると、基になる物理接続は閉じられるのではなくリサイクルされます。

したがって、接続が物理的に閉じられていることに問題がある場合は、HibernateやSpringではなく、プールにもっと注意を払う必要があります。前述のように機能するclose()を呼び出す以上のことはできません。

于 2012-05-02T07:43:58.623 に答える