web-dev-qa-db-ja.com

Hibernate session.close()がプールへの接続を返さない

私のアプリケーションには長時間実行されるトランザクションがあるため、すべてのメソッドの最後でオプション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プールへの接続を解放していないようです。詳細が必要な場合はお知らせください。

14
Perfuser123

アプリケーションで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「コンテキストセッション」 を参照してください。

それでも問題が解決しない場合は、環境と構成(春?)、セッションの取得方法などの詳細を追加してください。

20
Pascal Thivent

jDBCTransactionManagerを使用している場合、トランザクションが終了すると、接続は接続プールに返されます。

0
Salandur