4.5 UCPでの接続の獲得について

接続獲得機能を使用すると、接続プールが指定された使用可能な接続数に達したときに、指定された数の流用された接続を回収できます。この項では、次の概念について説明します。

4.5.1 UCPでの接続の獲得の概要

この機能は、プール内で一定数の接続を常に使用可能な状態にし、パフォーマンスの最大化に役立ちます。特に、アプリケーションで接続ハンドルをキャッシュする場合に便利です。通常、キャッシングはパフォーマンス上の理由から実行されます。これは、キャッシングにより、接続がトランザクションに参加するために必要となる状態の再初期化が最小限になるためです。

たとえば、接続はプールから流用され、必要なセッション状態で初期化された後、コンテキスト・オブジェクト内に保持されます。この方法で接続を保持することが、接続プールに使用可能な接続がなくなる原因になる可能性があります。接続獲得機能では、該当する場合に、流用された接続を回収して再利用できるようにします。

接続獲得は、HarvestableConnectionインタフェースを使用して制御し、接続獲得トリガー数と接続獲得最大数の2つのプール・プロパティを使用して構成または有効にします。接続獲得機能を実装するときは、これらのインタフェースおよびプロパティを併用します。

4.5.2 獲得可能への接続の設定

oracle.ucp.jdbc.HarvestableConnectionインタフェースのsetConnectionHarvestable(boolean)メソッドは、接続を獲得するかどうかを制御します。このメソッドは、接続獲得が有効である場合にロック・メカニズムとして使用されます。たとえば、トランザクション内で接続が使用されていて接続の獲得を禁止する場合、このメソッドを接続に対してfalseに設定します。トランザクションの完了後、このメソッドを接続に対してtrueに設定すると、必要に応じて接続を獲得できます。

注意:

接続獲得機能が有効である場合、デフォルトではすべての接続が獲得可能です。この機能が有効である場合、接続が獲得可能かどうかを明示的に制御するため、setConnectionHarvestableメソッドを常に使用する必要があります。

次の例では、接続獲得機能で接続を獲得しようとしても接続が獲得不可であることを示す、setConnectionHarvestableメソッドの使用例を示しています。

Connection conn = pds.getConnection();

((HarvestableConnection) conn).setConnectionHarvestable(false);

4.5.3 獲得トリガー数の設定

接続獲得トリガー数は、接続獲得をトリガーする使用可能な接続のしきい値を指定します。たとえば、接続獲得トリガー数を10に設定した場合、プール内の使用可能な接続数が10まで減少すると、接続獲得がトリガーされます。

Integer.MAX_VALUE(デフォルトでは2147483647)は、接続獲得が無効であることを示します。デフォルト値はInteger.MAX_VALUEです。

次の例では、接続獲得トリガー数を構成して接続獲得を有効にしています。

pds.setConnectionHarvestTriggerCount(2);

4.5.4 獲得最大数の設定

接続獲得最大数プロパティは、獲得トリガー数に達した場合に、プールに返す必要がある流用された接続の数を指定します。実際に獲得される接続数は、0から接続獲得最大数の値までのいずれかです。最も長い間使用されていない接続から先に獲得されるため、非常にアクティブなユーザー・セッションが最大限に接続を保つことができます。

獲得最大数の値の範囲は、0から最大接続数プロパティの値までです。デフォルト値は1です。範囲外の値を指定すると、SQL例外がスローされます。

次の例では、接続獲得最大数の構成を示します。

pds.setConnectionHarvestMaxCount(5);

注意:

  • 接続獲得機能および中止接続タイムアウト機能が同時に有効になっている場合、タイムアウト処理では、獲得できないとして指定された接続を回収しません。

  • 接続獲得機能およびTTL接続タイムアウト機能が同時に有効になっている場合、タイムアウト処理では、獲得できないとして指定された接続を回収します。