IBM Support

[Db2] Jcc ドライバーの照会タイムアウト用 Timer がパフォーマンスに与える影響

Question & Answer


Question

IBM Data Server Driver for JDBC and SQLJ (以降 Jcc ドライバー) で短時間に数多くの Statement を実行したり、接続の妥当性検査のために Connection.isValid を呼び出すと、各要求が java.util.Timer オブジェクトを生成し、これに伴うスレッドの生成で Java VM 全体のパフォーマンスが著しく落ちることがあります。 この現象の理由と回避方法はありますか。

Cause

Jcc ドライバーは SQL ステートメントの照会タイムアウトを処理するために、java.util.Timer オブジェクトを利用します。
また、Timer オブジェクトのインスタンスを生成すると、Java VM 内に新しいスレッドが作られます。

Jcc ドライバーはデフォルトで Statement、PreparedStatement および CallableStatement の実行時 (execute*) に Timer を生成します。
このため、照会タイムアウトを設定したステートメントを頻繁に実行する場合、Timer スレッド生成の負荷により Java VM 全体のパフォーマンスが低下することがあります。
なお、照会タイムアウトは以下のような方法で設定できます。
  • Statement/PreparedStatement/CallableStatement に対する setQueryTimeout
  • Jcc ドライバーの commandTimeout カスタム・プロパティー
  • WebSphere データ・ソースの webSphereDefaultQueryTimeout カスタム・プロパティー

Jcc 3.64 および 4.14 以降、DB2Connection.isDBValid や Connection.isValid (JDBC 4.0) も、照会タイムアウトつきの接続検査用 Statement の実行として処理されるため、同じ考慮点が適用されます。
WebSphere Application Server を利用している場合、接続の妥当性検査を設定すると、これらのメソッドが呼び出されます。

Answer

Jcc ドライバーのカスタム・プロパティー、timerLevelForQueryTimeOut に QUERYTIMEOUT_CONNECTION_LEVEL (2) を設定しConnection レベルで Timer オブジェクトを 生成することにより、ステートメント実行時の Timer 生成による負荷を削減できます。QUERYTIMEOUT_CONNECTION_LEVEL (2) では、接続の最初のステートメント実行で Timer を作成し、以降の照会タイムアウト検査はこの Timer に対する TimerTask によって行われます。このプロパティーの詳細は、以下のマニュアル・ページを参照してください。
サポートされるすべてのデータベース製品に共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー
なお、Db2 11.5 以降、timerLevelForQueryTimeOut のデフォルトは QUERYTIMEOUT_CONNECTION_LEVEL (2) に変更されています。
IBM Data Server Driver for JDBC and SQLJ の機能拡張

WebSphere Application Server (WAS) で Jcc ドライバーを利用している場合、以下の手順でカスタム・プロパティーを設定できます。
カスタム・プロティーで明示的に指定していない場合、Jcc ドライバーのデフォルト (0: 1 と等価) が使われます。
  1. WebSphere Application Server の管理コンソールを開きます。
  2. データ・ソースの「WebSphere Application Server データ・ソース・プロパティー」パネルに移動します。
    a) WAS 8.5.0 以前の構成プロファイル・テンプレートを使っている場合
     「リソース」>「JDBC」>「データ・ソース」>「(データ・ソース名)」を選択します。
     「WebSphere Application Server データ・ソース・プロパティー」を選択します。
    b) WAS 8.5.5 以降の構成プロファイル・テンプレートを使っている場合
     「リソース」>「JDBC」>「データ・ソース」>「(データ・ソース名)」>「カスタム・プロパティー」を選択します。
     「WebSphere Application Server データ・ソース・プロパティー」を選択します。
  3. プロパティー timerLevelForQueryTimeOut に数値型の 2 を設定します。

接続の妥当性検査を含む、一切の照会タイムアウト機能を利用しない場合、timerLevelForQueryTimeOut に QUERYTIMEOUT_DISABLED (-1) を設定できます。
QUERYTIMEOUT_DISABLED に設定すると、Timer は生成されません。

運用上の考慮点
  • timerLevelForQueryTimeOut プロパティーは Jcc 3.59 および Jcc 4.9 以降で利用可能です。
    Jcc ドライバーのバージョンは、以下のコマンドで確認できます。
    java -cp <db2jcc.jar/db2jcc4.jar のフルパス> com.ibm.db2.jcc.DB2Jcc -version
  • timerLevelForQueryTimeOut を QUERYTIMEOUT_CONNECTION_LEVEL (2) に設定すると、Connection.close まで Timer オブジェクトとスレッドが残ります。
    このため、データベース接続の数が多いアプリケーションでは、残存する Timer オブジェクトが Java ヒープを圧迫することがあります。Db2 11.5 以降、timerLevelForQueryTimeOut は QUERYTIMEOUT_CONNECTION_LEVEL (2) がデフォルトですが、この場合に接続ごとの Timer が正しく破棄されず、メモリー・リークを起こすことがあり 11.5.7 (Jcc 4.31) で修正されています。
    IT38240: JAVA.LANG.OUTOFMEMORYERROR WITH TIMERLEVELFORQUERYTIMEOUT DEFAULT SETTING
  • timerLevelForQueryTimeOut を QUERYTIMEOUT_STATEMENT_LEVEL (1) に設定した場合と、QUERYTIMEOUT_CONNECTION_LEVEL (2) に設定した場合で、照会タイムアウト機能の差異はありません。QUERYTIMEOUT_DISABLED (-1) に設定した場合は、照会タイムアウト機能は利用できません。
  • Jcc ドライバーのバージョン一覧と、ダウンロード・リンクは以下の Technote を参照してください。
    Db2 JDBC Driver Versions and Downloads
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと 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":"a8m0z0000001jHFAAY","label":"Connectivity-\u003EJDBC"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"10.1.0;10.5.0;11.1.0;11.5.0;9.7.0"}]

Document Information

Modified date:
23 August 2023

UID

swg21962870