私のアプリケーションには長時間実行されるトランザクションがあるため、すべてのメソッドの最後でオプションsession.close()を試して、接続オブジェクトが長期間無期限に保持されないようにしました。
Session.close()オプションを使用すると、Hibernateのセッションオブジェクトと、session.connection()から取得した対応するConnectionオブジェクトが正しく破棄されていることがわかりました。しかし、問題は接続プールにあります。セッションによって取得された接続は、セッションを閉じた後でも接続プールに解放されません。プールからの接続を待機している他のリクエストが見つかりました。
アプリケーションでJTAトランザクションを使用しています。 hibernate.cfg.xmlで、connection.release_modeをauto(デフォルト)に設定し、connection.autocommitをtrueに設定しました。
誰かがこの問題に直面しましたか?ここで何が欠けているのか教えてください。
フォローアップ:これは私の休止状態の構成ファイルの詳細です:
<property name="connection.datasource">MXoraDS</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.release_mode">after_statement</property>
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="hibernate.current_session_context_class">org.hibernate.context.JTASessionContext</property>
<property name="transaction.auto_close_session">true</property>
<property name="max_fetch_depth">2</property>
OracleDBに接続するアプリケーション層でJSFとEJB2.1を使用します。 after_statement
プールへの接続を解放していないようです。詳細が必要な場合はお知らせください。
アプリケーションでJTAトランザクションを使用しています。 hibernate.cfg.xmlで、connection.release_modeをauto(デフォルト)に設定し、connection.autocommitをtrueに設定しました。
hibernate.connection.release_mode
プロパティをafter_statement
に明示的に定義してみてください。これがデフォルトであるはずですが、コンテキストによっては(Springを使用できますか?)、auto
が期待どおりに動作しない場合があります( ここおよびここ )。
参考までに、 表3.4。HibernateJDBCおよび接続プロパティ がプロパティhibernate.connection.release_mode
について記述している内容は次のとおりです。
HibernateがJDBC接続を解放するタイミングを指定します。デフォルトでは、JDBC接続は、セッションが明示的に閉じられるか切断されるまで保持されます。 アプリケーションサーバーのJTAデータソースの場合、
after_statement
を使用して、JDBC呼び出しのたびに接続を積極的に解放します。非JTA接続の場合、各トランザクションの終了時に接続を解放することが理にかなっていることがよくあります。 、after_transaction
を使用します。auto
は、JTAおよびCMTトランザクション戦略にafter_statement
を選択し、JDBCトランザクション戦略にafter_transaction
を選択します。例
auto
(デフォルト)|on_close
|after_transaction
|after_statement
この設定は、
SessionFactory.openSession
から返されるセッションにのみ影響します。SessionFactory.getCurrentSession
を介して取得されたセッションの場合、使用するように構成されたCurrentSessionContext
実装は、それらのセッションの接続解放モードを制御します。 セクション2.5「コンテキストセッション」 を参照してください。
それでも問題が解決しない場合は、環境と構成(春?)、セッションの取得方法などの詳細を追加してください。
jDBCTransactionManagerを使用している場合、トランザクションが終了すると、接続は接続プールに返されます。