IBM Support

[Db2] SQLJ の接続コンテキストをクローズすると IndexOutOfBoundsException が発生する

Question & Answer


Question

SQLJ の接続コンテキストをクローズする際に IndexOutOfBoundsException が発生しました。原因と対処方法を教えてください。

Cause

WebSphere Application Server 上で SQLJ アプリケーションを実行する場合は、SQLJ アプリケーションの中で SQLJ 接続コンテキストをクローズする必要があります。
SQLJ 接続コンテキストをクローズしなかった場合、GC (Garbage Collector) によって SQLJ 接続コンテキストの Finalize 処理が実行されます。
この Finalize 処理の中で、SQLJ 接続コンテキストに存在するオブジェクト (プリペアード・ステートメント、接続、プロファイルなど) がクローズされます。
GC によって Finalize 処理が実行されると、複数のスレッド (通常のスレッドと Finalizer スレッド) が同一の WebSphere JDBC オブジェクトにアクセスするため、WebSphere プログラミング・モデルに違反することになります。この場合、WebSphere Application Server トレースに以下のようなメッセージが出力される場合があります。
  • 例 1
    WSJdbcPrepare 1  Already closed.
  • 例 2
    java.lang.IndexOutOfBoundsException.

Answer

以下の二通りの解決方法があります。
 
  1. アプリケーションで、使用後に明示的に SQLJ 接続コンテキストをクローズします。その際、KEEP_CONNECTION オプションを指定する必要があります。

    コンテキストが myContext の場合は、以下のようなコードになります。
    myContext.close(false);

    KEEP_CONNECTION オプションを指定したコンテキストのクローズに失敗した場合、以下のような例外が WebSphere Application Server に返ります。
    com.ibm.websphere.ce.cm.ObjectClosedException: DSRA9110E: Connection is closed.
  2. SQLJ アプリケーションのソース・ファイルを -db2optimize オプションを指定して変換し、SQLJ プロファイルをカスタマイズします。これにより、 Db2 が作成したデフォルト・コンテキストが WebSphere Application Server 内部でキャッシュされるようになります。このオプションにより、接続コンテキストがキャッシュされるようになるため、パフォーマンスも向上します。
     
関連情報
SQLj Applications must close Connection Context after usage
パスポート・アドバンテージによく寄せられる質問

お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmVAAU","label":"Programming Interface-\u003EJDBC"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
23 August 2023

UID

swg21660789