Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)


3.14.4 ステートメントプーリング

DB Connectorを使用した場合,JDBCドライバから取得するjava.sql.PreparedStatementとjava.sql.CallableStatementのオブジェクトを保持して再利用を行うプーリング機能を使用できます。ステートメントプーリング機能によって,PreparedStatementとCallableStatementを使用した場合のパフォーマンス向上が図れます。なお,PreparedStatementとCallableStatementのプールサイズは,DB Connectorの設定で指定します。ステートメントプーリングを使用する際のプールサイズ設定の指針については,マニュアル「アプリケーションサーバ システム設計ガイド」の「8.5.2 ステートメントプーリングを使用する」を参照してください。また,DB Connectorのプロパティ定義については,マニュアル「アプリケーションサーバ アプリケーション設定操作ガイド」の「4.2.2 DB Connectorのプロパティ定義」を参照してください。

ステートメントプーリング機能では,ステートメントを再利用する際にステートメントを初期化します。初期化する内容はJ2EEサーバのプロパティをカスタマイズして設定します。ステートメントプーリング機能の設定については,「3.14.10 実行環境での設定」を参照してください。

ステートメントプーリング機能を利用するには,コネクションプーリング機能を使用する必要があります。また,トランザクションサポートレベルにグローバルトランザクションを指定した場合,HiRDBのバージョンによっては利用できないことがあります。

注意事項

HiRDB Type4 JDBC Driverを使用する場合,PreparedStatement,CallableStatementのプールサイズに制限があります。指定できるプールサイズについては,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」の「4.1.10 DB Connectorに設定する<config-property>タグに指定できるプロパティ」を参照してください。

なお,ステートメントプーリング機能を使用しない場合は,PreparedStatement,およびCallableStatementのプールサイズを両方とも0にしてください。

〈この項の構成〉

(1) 前提条件

トランザクションサポートレベル,コネクションプーリング使用の有無,使用するデータベースの種類との対応による,ステートメントプーリング利用について次の表に示します。

表3‒55 ステートメントプーリングの利用

トランザクションサポートレベル

コネクションプーリングを使用する

コネクションプーリングを使用しない

HiRDB※1

Oracle

SQL Server

XDM/RD E2

HiRDB/Oracle/SQL Server

トランザクションなし(NoTransaction)

×

ローカルトランザクション(LocalTransaction)

×

グローバルトランザクション(XATransaction)

※2

×

×

×

(凡例) ○:利用できる  ×:利用できない

注※1 ステートメントプーリング機能を使用した状態で,定義SQLを実行しないでください。定義SQLを実行する場合,ステートメントプーリング機能は使用できません。また,定義SQLを実行する場合は,HiRDBのクライアント環境変数として「PDDDLDEAPRP=YES」を設定する必要があります。

注※2 JDBCのDatabaseMetaData#supportsStatementPooling()の戻り値がtrueの場合に,利用できます。

なお,XDM/RD E2を使用する場合はXDM/RD E2 11-03以降のバージョンとHiRDB Type4 JDBC Driver 08-02以降を使用するときにだけステートメントプーリング機能を使用できます。ステートメントプーリング機能の設定については,「3.14.10 実行環境での設定」を参照してください。

(2) ステートメントプーリングの動作

リソースアダプタのコンフィグレーションプロパティで設定するステートメントプーリングの動作について説明します。

ステートメントプーリング機能の動作を,次の表に示します。

表3‒56 ステートメントプールの状態と動作

ユーザアプリケーションプログラム処理

ステートメントプールの状態

ステートメントプールの動作

PreparedStatement,CallableStatementの生成を要求

プール内に未使用状態のPreparedStatement,CallableStatementがある

プール内で未使用状態のPreparedStatement,CallableStatementの一つが選択され,ユーザアプリケーションプログラムに渡されます。選択されたPreparedStatement,CallableStatementは,プール内で使用中状態になります。

プール内に未使用状態のPreparedStatement,CallableStatementがなく,プール内のPreparedStatement,CallableStatementの総数が「PreparedStatementPoolSize」,「CallableStatementPoolSize」の値に満たない

新規にPreparedStatement,CallableStatementを生成します。生成したPreparedStatement,CallableStatementはユーザアプリケーションに渡され,PreparedStatement,CallableStatementはプール内で使用中状態となります。

プール内に未使用状態のPreparedStatement,CallableStatementがなく,プール内のPreparedStatement,CallableStatementの総数が「PreparedStatementPoolSize」,「CallableStatementPoolSize」の値以上

タイムスタンプが最も古いPreparedStatement,CallableStatementをプールから削除したあと,新規にPreparedStatement,CallableStatementを生成します。生成したPreparedStatement,CallableStatementはユーザアプリケーションに渡され,PreparedStatement,CallableStatementはプール内で使用中状態となります。

PreparedStatement,CallableStatementを解放

PreparedStatement,CallableStatementはプール内で未使用状態に戻ります。

(凡例) −:該当なし

注※ プール内のPreparedStatement,CallableStatementのタイムスタンプが更新されるタイミングは,次のとおりです。

  • 新規に生成したPreparedStatement,CallableStatementがプールに追加されるとき

  • プール内のPreparedStatement,CallableStatementが使用中状態になるとき

(3) ステートメントプーリング機能を使用する場合の注意事項

ステートメントプーリング機能を使用する場合の注意事項を次の表に示します。

表3‒57 ステートメントプーリング機能を使用する場合の注意事項

条件

注意事項

  • ステートメントプーリング機能を使用しない場合と比べて,プールされているPreparedStatement,CallableStatementの数だけメモリが消費されます。各ステートメントのメモリ使用量については,使用するJDBCドライバのマニュアルを参照してください。

  • ステートメントプールは,コネクションプール内のコネクションごとにあるため,プールされるPreparedStatement,CallableStatementの最大数は,「MaxPoolSize」×(「PreparedStatementPoolSize」+「CallableStatementPoolSize」)となります。

  • ステートメントオブジェクトを保持することで,JDBCドライバやDBサーバへ与える影響については,ご利用のDBサーバの仕様を確認してください。

  • ステートメントプーリング機能をコネクション数調節機能またはコネクション障害検知機能と併用した場合,コネクションプールから取り除かれた未使用コネクションは,コネクションプール内のコネクション数としてカウントされません。このため,プールされているPreparedStatement,CallableStatementの数がコネクションプールの最大値×PreparedStatementPoolSize,およびコネクションプールの最大値×CallableStatementPoolSizeを一時的に超える場合があります。

  • ステートメントプーリング機能を使用してステートメントを再利用する場合,setMaxFieldSizeの設定値が初期化されないことがあります。

    初期化されないのは,次の条件がすべて重なるときです。

    ・Oracle JDBC Thin Driverに対応したDB Connectorを使用した

    ・setMaxFieldSizeメソッドを使用して,java.sql.PreparedStatement,またはjava.sql.CallableStatementの値を変更した

OracleまたはSQL Serverに接続

  • ステートメントプーリング機能と,コネクションの障害検知機能を併用する場合

    コネクションの障害検知に使用されるPreparedStatementがコネクションごとに一つプーリングされます。そのため,PreparedStatementPoolSize,CallableStatementPoolSizeを決定する際には,コネクションの障害検知用のPreparedStatementもリソース数の見積もりに加えて,CallableStatementPoolSizeを最大ステートメント数未満に設定してください。

  • ステートメントプーリング機能と,コネクションプールのウォーミングアップ機能を併用する場合

    コネクションが生成されてプーリングされるときに,コネクションの障害検知に使用されるSQLで生成したPreparedStatementがコネクションごとに一つプーリングされます。

  • ステートメントプーリング機能と,リザルトセットの保持機能を併用する場合

    Oracle接続でリザルトセットの保持機能を使用する場合,Connection.prepareStatement()メソッドまたはprepareCall()メソッドの引数にリザルトセットの保持機能を指定してください。Connection.setHoldability()メソッドでは,リザルトセットの保持機能は指定できません。

(凡例) −:該当なし

注※

コネクションの障害検知機能を使用する場合には,CallableStatementPoolSizeを最大ステートメント数未満に設定してください。

コネクションの障害検知機能を使用すると,プーリングされているCallableStatementの数が最大ステートメント数に達したとき,コネクションの障害検知が実行されます。このとき,CallableStatementPoolSize=<最大ステートメント数>と設定していると,JDBCドライバの一つのコネクションで利用できるリソース数の最大値を超えるため,例外が発生します。例外が発生すると障害が発生したと判断されるので,そのコネクションはコネクションプールから削除され,同時にステートメントプールも破棄されます。つまり,ステートメントプーリング機能を使用する意味がなくなってしまいます。