以下の場合に、Statementキャッシュ機能を使用できます。
データベースタイプが“Oracle”で、データソースの種類が“Oracleのコネクションプーリングを使用する”の場合
この場合、Oracle10g以降のStatementキャッシュ機能が使用可能になります。
なお、“Oracleのコネクションプーリングを使用する”データソースでは分散トランザクションが使用できないため、本機能は分散トランザクション環境では使用できません。
データベースタイプが“Symfoware”で、データソースの種類が“Interstageのコネクションプーリングを使用する”の場合
Statementをキャッシュすることによって、SQL文の解析、作成によるオーバーヘッドの軽減や、データベースとの通信回数を削減する効果があります。
キャッシュ対象となるStatementは以下です。
Connection.prepareStatement(String)メソッドで取得したPreparedStatementオブジェクト
Connection.prepareStatement(String, int, int)メソッドで取得したPreparedStatementオブジェクト
Connection.prepareStatement(String, int)メソッドで取得したPreparedStatementオブジェクト
Connection.prepareStatement(String, int[])メソッドで取得したPreparedStatementオブジェクト
Connection.prepareStatement(String, int, int, int)メソッドで取得したPreparedStatementオブジェクト
Connection.prepareStatement(String, String[])メソッドで取得したPreparedStatementオブジェクト
Connection.prepareCall(String)メソッドで取得したCallableStatementオブジェクト
Connection.prepareCall(String, int, int)メソッドで取得したCallableStatementオブジェクト
Connection.prepareCall(String, int, int, int)メソッドで取得したCallableStatementオブジェクト
■チューニング方法
Statementキャッシュサイズ
Statementキャッシュサイズは、使用するデータソースに対して、Interstage管理コンソールまたはisj2eeadminコマンドで設定します。
Interstage管理コンソールでは、[IJServer] > [環境設定] > [DBコネクション設定] > [Statementキャッシュサイズ]で設定します。[Statementキャッシュサイズ]に0を設定した場合は、Statementキャッシュは行なわれません。
isj2eeadminコマンドの詳細については、“リファレンスマニュアル(コマンド編)”を参照してください。
なお、JDBCリソース定義画面の接続オプションでStatementキャッシュサイズを設定し、同時にDBコネクション設定でキャッシュサイズを指定した場合は、DBコネクション設定で行ったキャッシュサイズの値が有効になります。
設定の指針
Statementはコネクション単位でキャッシュされ、コネクションは実行する同一IJServerプロセス内のアプリケーション全体で共通に使用されます。
アプリケーションで発行されるStatement数がStatementキャッシュサイズより大きくなるとキャッシュから削除されるStatementが増加します。アプリケーションが要求するStatementがキャッシュから削除されていると、Statementの再作成のために、データベースとの通信、SQLステートメント文の解析によるオーバーヘッドが発生します。
キャッシュからのStatement削除回数を削減するため、StatementキャッシュサイズをIJServerプロセスで発行されるStatementの総数もしくはそれに近い値を設定することを推奨します。ただし、Statementのキャッシングはマシン資源を消費します。マシンスペックを考慮の上でStatementのキャッシュサイズの設定を行う必要があります。
また、アプリケーションサーバ(コンテナ)側でStatementを発行するCMPアプリケーションの場合は、次の数の合計値をアプリケーションで発行するStatementの代わりにキャッシュサイズへ追加します。
CMP1.1 Entity Beanの場合
Bean単位で算出するStatement
4つ(挿入、削除、更新、検索(プライマリキー))
1件検索、複数件検索メソッド数
CMP2.0 Entity Beanの場合
Bean単位で算出するStatement
4つ(挿入、削除、更新、検索(プライマリキー))
deployment descriptorに定義したEJB QLクエリ数
relationship単位で算出するStatement
CMP2.0 Entity Bean間の単方向、かつ、1:1のrelationship数
CMP2.0 Entity Bean間の双方向、かつ、1:1のrelationship数×2
CMP2.0 Entity Bean間の単方向、かつ、1:多、多:多のrelationship数×3
CMP2.0 Entity Bean間の双方向、かつ、1:多、多:多のrelationship数×4
OPEN_CURSORSの設定(Oracleを使用する場合)
Statementキャッシュ機能を使用する場合、コネクションのクローズ時にStatementは破棄されず、1コネクションで同時に発行しているStatementは増加します。このため、“1コネクション(トランザクション)で同時に発行可能なStatement数の上限値(以降OPEN_CURSORS/デフォルト:50)”を超える可能性があります。Statement数がOPEN_CURSORSを超えた場合、SQLExceptionが発生します。
このような場合は、OPEN_CURSORSが、Statementキャッシュサイズ以上となるように設定してください。OPEN_CURSORSの設定方法は、Oracleのマニュアルを参照して下さい。
■キャッシュされたStatementの削除契機
キャッシュされたStatementは、以下の契機で削除されます。また、実行したSQL文の数が、「Statementキャッシュサイズ」に設定した値に達した場合、それ以降実行するSQL文の扱いについては使用するJDBCドライバの仕様に依存します。(JDBCドライバの仕様によりキャッシュされたStatementが削除される場合があります。)JDBCドライバの仕様については、各JDBCドライバのマニュアルを参照してください。
JDBCプーリングコネクションの時間監視機能
Statementは接続インスタンス(コネクション)ごとにキャッシングされるため、物理接続が接続キャッシュ内にアイドル状態で存続できる最大期間を超過したコネクションオブジェクトを開放する時に、そのコネクションでキャッシュされていたStatementオブジェクトも削除されます。
コネクションの物理的開放
Statementは接続インスタンス(コネクション)ごとにキャッシングされるため、コネクションがプーリングされている時にデータベースダウンなどによりコネクションが無効となった場合、そのコネクションを開放する際にキャッシュされていたStatementオブジェクトも削除されます。