ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server Express 移行ガイド
FUJITSU Software

2.23.1 JDBCコネクションの解放漏れについて

アプリケーションが以下の条件に該当する場合、Interstage Java EE機能ではJDBCコネクションがJDBC接続プールに戻されないため、コネクションの枯渇が発生します。

  1. アプリケーションがUserTransactionインタフェースによりトランザクションを利用している、または、
    EJBのコンテナ管理によりトランザクションを利用している。かつ、

  2. トランザクション境界内でJDBCコネクションを取得している。かつ、

  3. トランザクション完了(commitまたはrollback)前に条件2で取得したJDBCコネクションを解放(closeメソッド発行)していない。かつ、

  4. トランザクション完了した場合。

枯渇した状態において、JDBCコネクションを取得(javax.sql.DataSourceのgetConnectionメソッド発行)した場合、JDBC接続プールの「最大待ち時間」経過後、下記SQLExceptionがスローされます。

java.sql.SQLException: Error in allocating a connection. Cause: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.

Interstage J2EE機能では、トランザクション完了(commitまたはrollback)時にJDBCコネクションを強制的に解放していたため、アプリケーションのJDBCコネクション解放漏れが顕在化しませんでした。

Interstage Java EE機能への移行時にJDBCコネクションの解放漏れがないか以下の方法で確認し、解放していない場合はトランザクション完了前にJDBCコネクションの解放を行うようアプリケーションを修正してください。

JDBCコネクションの解放漏れの確認方法

JDBCコネクションの解放漏れは動作検証により確認してください。モニタロギング機能を有効にし、かつ「JDBC接続プール」の設定をLOWまたはHIGHに設定した環境において、アプリケーションを実行してください。JDBC接続プール情報の「使用中の物理接続の現在数」(Java EE管理コンソール画面の場合、NumConnUsed)がすべてのアプリケーション処理完了後に0に戻らない場合、JDBCコネクションの解放漏れが存在します。

さらに、「リーク再要求」を有効化し、「リークタイムアウト」を設定することでJDBCコネクションの解放漏れの検知とJDBCコネクションの破棄を行えます。ただし、本機能はアプリケーション処理に対して設定時間が妥当でない場合、正常処理中にも関わらずコネクションが回収されてしまう問題が発生する可能性があります。本機能はアプリケーション開発時における暫定回避やJDBCコネクションの解放漏れ検知のために利用してください。