11.5. コネクション開放モード

Hibernate のレガシー(2.x)の JDBC コネクション管理に関する振る舞いは、最初に必要とした際に Session がコネクションを得て、セッションが閉じられるまで、そのコネクションを保持しました。 Hibernate 3.x は、セッションに JDBC コネクションをどのように制御するかを伝えるコネクション開放モードという概念を導入しました。以降の議論は、構成された ConnectionProvider を通して提供されるコネクションに適切であることに注意してください。異なる開放モードは、org.hibernate.ConnectionReleaseMode に列挙された値により特定されます。
  • ON_CLOSE:本質的に上記で述べたレガシーの振る舞いです。 Hibernate セッションは最初に JDBC アクセスを実行する必要がある際にコネクションを得ます。そして、セッションが閉じられるまで、コネクションを保持します。
  • AFTER_TRANSACTIONorg.hibernate.Transaction が完了した後、コネクションを開放します。
  • AFTER_STATEMENT (積極的な開放とも呼ばれる):すべてのステートメントが実行された後、コネクションが開放されます。ステートメントがセッションに関連するリソースを開いたままにする場合は、この積極的な開放はスキップされます。今のところ、これが起こるのは org.hibernate.ScrollableResults が使われる場合のみです。
コンフィギュレーションパラメータの hibernate.connection.release_mode は、使用する開放モードを指定するために使います。指定できる値は次の通りです:
  • auto (デフォルト):これを選択すると org.hibernate.transaction.TransactionFactory.getDefaultReleaseMode() メソッドによって返される開放モードに委譲されます。このメソッドは、 JTATransactionFactory には ConnectionReleaseMode.AFTER_STATEMENT を返し、 JDBCTransactionFactory には ConnectionReleaseMode.AFTER_TRANSACTION を返します。このデフォルトの動作を変更しないでください。というのは、この設定値が原因で起こる障害は、ユーザーコードの中でバグや間違った条件になりやすいからです。
  • on_close - ConnectionReleaseMode.ON_CLOSE を使います。この設定は後方互換のために残されていますが、当設定の使用はお薦めできません。
  • after_transaction:ConnectionReleaseMode.AFTER_TRANSACTION を使います。この設定は JTA 環境の中では使うべきではありません。また、ConnectionReleaseMode.AFTER_TRANSACTION を指定し、自動コミットモードの中では、開放モードが AFTER_STATEMENT であるかのように、コネクションは開放されることに注意してください。
  • after_statement:ConnectionReleaseMode.AFTER_STATEMENT を使います。さらに、設定された ConnectionProvider は、この設定 (supportsAggressiveRelease()) をサポートするかどうかを調べるために使用します。そうでない場合、開放モードは ConnectionReleaseMode.AFTER_TRANSACTION にリセットされます。この設定は次の環境でのみ安全です。それは、 ConnectionProvider.getConnection() を呼び出すたびに基盤となる JDBC コネクションが同じものを取得できるか、同じコネクションが得られることが問題とならない自動コミット環境の中です。