3.15.6 コネクションの自動クローズ
ユーザプログラムがオープンしたリソースのコネクションは,ユーザプログラムでクローズする必要があります。例外発生などの理由で,ユーザプログラムがコネクションをクローズすることができない場合,WebコンテナやEJBコンテナが自動的にコネクションをクローズする機能があります。
コネクション自動クローズ機能は,機能によって有効と無効を切り替えることができます。コネクションの自動クローズの方法と切り替えについて次の表に示します。
自動クローズの方法 |
有効と無効の切り替え |
備考 |
---|---|---|
Webコンテナによるコネクション自動クローズ |
○※1,※2 |
− |
EJBコンテナによるコネクション自動クローズ |
×※1 |
常に有効になります。 |
- 〈この項の構成〉
(1) Webコンテナによるコネクション自動クローズ
サーブレットやJSPのサービスメソッド内で,取得・オープンされたJDBCコネクションのうち,メソッドの実行完了時にクローズが実行されていないコネクションに対して,J2EEコンテナ側で自動的にコネクションをクローズします。これによって,オープンされたまま蓄積しているコネクションを自動でクローズできます。
なお,コネクションの自動クローズ機能は,サーブレット内部の別のメソッド,または外部のクラスでコネクションを取得・利用した場合にも有効です。
Webコンテナによるコネクション自動クローズは,サーブレットやJSPのserviceメソッドが完了したときに実行されます。
(2) EJBコンテナによるコネクション自動クローズ
例外発生などの理由で,EJB内で取得したリソースのコネクションをユーザがクローズできない場合に,EJBコンテナが自動的にコネクションをクローズして解放する機能です。
EJBコンテナによるコネクションの自動クローズは,次のタイミングで実施されます。
-
EJBが破棄されるとき
-
Stateless Session Beanで,ビジネスメソッドがリターンするとき
-
Stateful Session Beanがパッシベイトされるとき
-
Singleton Session Beanで,ビジネスメソッドがリターンするとき
なお,@Asynchronousアノテーションを指定したSingleton Session BeanまたはStateless Session Beanでは,次のタイミングでコネクションの自動クローズが実行されます。
-
Singleton Session BeanまたはStateless Session Beanのインスタンスが破棄された時
-
Singleton Session BeanまたはStateless Session Bean内の@Asynchronousアノテーションを指定したメソッドの実行が完了した時
(3) コネクション自動クローズが実行されたことを確認する方法
コネクション自動クローズが実行されたことは,メッセージログまたはPRFトレースで確認できます。
テスト実行時や障害調査時など,性能を考慮しなくてよい場合は,メッセージログによって確認することをお勧めします。実運用時に確認したい場合は,PRFトレースによって確認することをお勧めします。
(a) メッセージログで確認する方法
ログレベルを「Warning」に設定してください。
コネクション自動クローズが実行された場合は,J2EEサーバのメッセージログにKDJE31010-Wが出力されます。
ログレベルの設定方法については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「3.3.6 J2EEサーバのログ取得の設定」を参照してください。
(b) PRFトレースでの確認方法
JCAコンテナの機能レイヤのPRFトレース取得レベルを「詳細」に設定してください。
コネクション自動クローズが実行された場合は,PRFトレースファイルに次のイベントIDが出力されます。
-
0x8B84
-
0x8B85
PRFトレースの取得レベルの設定方法については,マニュアル「アプリケーションサーバ 機能解説 保守/移行編」の「3.3.6 J2EEサーバのログ取得の設定」を参照してください。また,機能レイヤごとのPRFトレース取得レベルの設定方法については,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「cprflevel(PRFトレース取得レベルの表示と変更)」またはマニュアル「アプリケーションサーバ リファレンス コマンド編」の「cprfstart(PRFデーモンの開始)」を参照してください。
(4) 注意事項
-
Servlet/JSPでユーザが生成したスレッド(ユーザスレッド)で取得したコネクションは,自動クローズされません。
-
自動クローズの際に,未決着のJDBCトランザクションがあった場合,JDBCトランザクションはロールバックされます。また,ユーザプログラムでコネクションをクローズした際に,未決着のJDBCトランザクションがあった場合,暗黙的にコミットされます。