この章には次の項が含まれます:
データ・ソースが指定された数の使用可能な接続に達した場合に解放する予約された接続数を指定できます。収集は、指定された数の接続をプール内で常に使用可能にするのに役立ち、接続初期化を最小限に抑えることでパフォーマンスを向上させます。
接続収集は、特にアプリケーションで接続ハンドルをキャッシュする場合に便利です。通常、キャッシングはパフォーマンス上の理由から実行されます。これは、キャッシングにより、接続がトランザクションに参加するために必要となる状態の初期化が最小限になるためです。たとえば、接続はデータ・ソースから予約され、必要なセッション状態で初期化された後、コンテキスト・オブジェクト内に保持されます。この方法で接続を保持することが、接続プールに使用可能な接続がなくなる原因になる可能性があります。接続収集により、予約された接続が適切に回収され、接続を再使用できるようになります。
アプリケーションで接続収集を使用するには、次の手順を実行します。
データ・ソース構成の「接続収集トリガー数」属性を使用して、接続収集をトリガーするためのしきい値を有効にし、このしきい値を指定します。たとえば、「接続収集トリガー数」が10に設定されている場合、接続収集が有効化され、使用可能な接続数が10まで減少すると、データ・ソースにより予約されている接続の収集が開始されます。デフォルト値の-1では、接続収集は無効化されます。
接続収集がトリガーされると、「接続収集最大数」により、プールに返却する必要のある予約された接続の数が指定されます。実際に収集される接続の数は、収集可能とマークされている接続の数によって決まり、1から「接続収集最大数」の範囲となります。
Oracle WebLogic Server管理コンソール・オンライン・ヘルプの接続プールに対する接続収集の構成に関する項を参照してください。
接続収集が有効化されると、すべての接続が収集可能と最初にマークされます。接続を収集可能にしない場合、引数値としてfalseを指定してoracle.ucp.jdbc.HarvestableConnectionインタフェースのsetConnectionHarvestable(boolean)メソッドをコールすることで、その接続を収集不可として明示的にマークする必要があります。
たとえば、トランザクション内でトランザクションが使用される場合に収集されないようにするには、次の文を使用します。
. . . Connection conn = datasource.getConnection(); ((HarvestableConnection) conn).setConnectionHarvestable(false); . . .
接続の操作が完了した後、setConnectionHarvestable(true)を設定することで、接続を収集可能としてマークできます。これにより、必要な場合に接続を収集できます。isConnectionHarvestable()をコールすることで、接続の収集可能状態を確認できます。
接続が収集されると、コールバックが登録されている場合にはアプリケーション・コールバックが実行され、接続がクリーンアップされます。接続ごとに固有のコールバックを生成する必要があります。通常、接続は接続オブジェクトを使用して初期化する必要があります。次に例を示します。
import java.sql.Connection;
. . .
public myHarvestingCallback implements ConnectionHarvestingCallback {
private Connection conn;
mycallback(Connection conn) {
this.conn = conn;
}
public boolean cleanup() {
try {
conn.close();
} catch (Exception ignore) {
return false;
}
return true;
}
}
. . .
Connection conn = ds.getConnection();
try {
(HarvestableConnection)conn).registerConnectionHarvestingCallback(
new myHarvestingCallback(conn));
(HarvestableConnection)conn).setConnectionHarvestable(true);
} catch (Exception exception) {
// This can't be from registration – setConnectionHarvestable must have failed.
// That most likely means that the connection has already been harvested.
// Do whatever logic is necessary to clean up here and start over.
throw new Exception("Need to get a new connection");
}
. . .
注意:
次の項目を考慮してください。
接続が収集された後、アプリケーションではConnection.closeのみコールできます。
アプリケーションにより接続がクローズされない場合、LEAKプロファイリングが有効の場合には、接続が強制的にクローズされたことを示す警告がログに記録されます。
コールバックにより例外がスローされた場合、メッセージがログに記録され、その例外は無視されます。すべてのスタック・トレースを取得するには、JDBCCONNデバッグを使用します。
クリーンアップ・メソッドの戻り値は無視されます。
データ・ソースで使用可能な接続が指定した数まで減少すると、アプリケーションにより収集可能とマークされた予約済接続が接続収集により解放されます。デフォルトでは、このチェックは30秒間隔で実行されます。weblogic.jdbc.harvestingFrequencySecondsシステム・プロパティを使用して、この動作を調整できます。このプロパティは、マークされた接続を収集する前にシステムが待機する時間を秒単位で指定します。このシステム・プロパティを1未満に設定すると、収集が無効になります。