4.4 UCPでの失効した接続

失効した接続とは、使用可能であるか流用中であるにもかかわらず、使用されなくなった接続です。流用されたままの失効した接続は、接続の可用性に影響を及ぼすことがあります。また、失効した接続があると、使用されていない接続を長期間維持するためにリソースが浪費されることから、システム・リソースに影響を及ぼすことがあります。この項で説明するプール・プロパティを使用して、失効した接続を制御します。

この節では、以下のトピックについて説明します。

注意:

アプリケーションで不要になった接続はすべてクローズすることをお薦めします。接続をクローズすると、流用されたままの失効した接続の数を少なくすることができます。

4.4.1 接続再利用とは

接続再利用機能を使用すると、一定の時間が経過した後または接続が一定の回数使用された後に、接続を適切にクローズして接続プールから削除できます。また、使用できない接続の維持に浪費されることになるシステム・リソースを節約します。

4.4.1.1 最大接続再使用時間の設定

最大接続再使用時間を使用すると、一定の時間使用された後に、接続を適切にクローズしてプールから削除できます。このプロパティのタイマーは、接続が物理的に作成されると開始します。流用された接続はプールに返された後にしかクローズされないため、再使用時間を超過します。

通常、この機能は、ファイアウォールがプール層とデータベース層の間に存在し、時間制限に基づいて接続をブロックするように設定されている場合に使用されます。ブロックされた接続は、使用できないにもかかわらずプールに残存します。このような場合、接続再使用時間をファイアウォールのタイムアウト・ポリシーより小さい値に設定します。

注意:

最大接続再使用時間は、TTL接続タイムアウトとは異なります。TTL接続タイムアウトは、接続がプールから流用されると開始します。一方、最大接続再使用時間は、接続が物理的に作成されると開始します。また、TTLタイムアウトでは、流用期間中にタイムアウトに達すると、接続をクローズして再利用のためにプールに返します。最大接続再使用時間では、タイムアウトに達すると、接続をクローズしてプールから破棄します。

最大接続再使用時間の値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0です。次の例では、最大接続再使用時間の構成を示します。

pds.setMaxConnectionReuseTime(300);

4.4.1.2 最大接続再使用数の設定

最大接続再使用数を使用すると、一定の回数流用された後に、接続を適切にクローズして接続プールから削除できます。通常、このプロパティは、メモリー・リークなどの問題を解消するために接続を定期的にリサイクルするために使用されます。

0は、この機能が無効であることを示します。デフォルト値は0です。次の例では、最大接続再使用数の構成を示します。

pds.setMaxConnectionReuseCount(100);

4.4.2 中止接続タイムアウトの設定

中止接続タイムアウト(ACT)を使用すると、流用された接続が一定時間使用されなかった場合に、接続プールに戻すことができます。中止の決定は、データベースへのコールを監視することで行われます。このタイムアウト機能は、接続再利用が最大限になるようにし、使用されていない流用された接続の維持に浪費されることになるシステム・リソースを節約します。

注意:

UCPでは、再利用のために接続を回収する前に、ローカル・トランザクションが保留中である接続を取り消すかロールバックします。

ACT値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0に設定されます。次の例では、中止接続タイムアウトの構成を示します。

pds.setAbandonedConnectionTimeout(10);

すべての接続が一定時間後にリープされます。ACTに達したとき、またはACTを免れた場合は、その免除の期限が切れるとリープされます。プールにACTを設定した場合は、次のようになります。

  • 文に対してStatement.setQueryTimeoutメソッドをコールせずにその文を実行した場合、サーバーが問合せに応答するのを接続が待機していても、ACTを超えると接続はリープされます。

  • Statement.setQueryTimeoutメソッドをコールして文を実行した場合、問合せタイムアウトおよびACTに達した後に接続はリープされます。問合せタイムアウトの待機中に、接続はリープされません。問合せタイムアウトの満了は、ACTタイマーをリセットするイベントです。問合せタイムアウトの満了時に発生するcancelアクションの待機中にACTに達した場合、接続はリープされます。

  • 1つの接続に、問合せタイムアウトが設定されたs1と問合せタイムアウトが設定されていないs2の2つの文がある場合、s1が問合せタイムアウトを待機している間、ACTによって接続はリープされませんが、s2がハングした場合、接続はリープされます。

    2つの文は、JDBCの要件に基づいて順番に実行されることに注意してください。

4.4.3 TTL接続タイムアウトの設定

TTL接続タイムアウトを使用すると、流用された接続を一定時間流用されたままにした後で、接続をプールに回収できます。このタイムアウト機能は、接続が最大限に再利用されるようにし、想定される使用時間よりも長く接続を維持するために浪費されることになるシステム・リソースの節約に役立ちます。

注意:

UCPでは、再利用のために接続を回収する前に、ローカル・トランザクションが保留中である接続を取り消すかロールバックします。

TTL接続タイムアウトの値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0に設定されます。次の例では、TTL接続タイムアウトの構成を示します。

pds.setTimeToLiveConnectionTimeout(18000)

4.4.4 接続待機タイムアウトの設定

接続待機タイムアウトは、プールに接続がなくなった場合にアプリケーション・リクエストが接続を取得するために待機する時間を指定します。プール内の接続がすべて使用されている(流用されている)場合、およびプール・サイズが最大プール・サイズのプロパティで指定されている最大接続許容数に達している場合、接続プールには接続がなくなります。タイムアウト値に達すると、リクエストはSQL例外を受け取ります。その場合、アプリケーションは接続の取得を再試行できます。このタイムアウト機能により、アプリケーションがブロックされる時間を最小限にすることでアプリケーション全体の有用性が向上し、適切なリカバリを実行できます。

接続待機タイムアウトの値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は3秒に設定されます。次の例では、接続待機タイムアウトの構成を示します。

pds.setConnectionWaitTimeout(10);

4.4.5 非アクティブ接続タイムアウトの設定

非アクティブ接続タイムアウトは、クローズしてプールから削除されるまでの、使用可能な接続がアイドル状態でいられる時間を指定します。このタイムアウト・プロパティは、使用可能な接続にのみ適用でき、流用された接続には作用しません。このプロパティは、使用されなくなった接続の維持に浪費されることになるリソースの節約に役立ちます。非アクティブ接続タイムアウトを(最大プール・サイズとともに)使用すると、アプリケーション・ロードが変化するにつれて接続プールを拡大または縮小できます。

非アクティブ接続タイムアウトの値は秒単位です。値0は、この機能が無効であることを示します。デフォルト値は0に設定されます。次の例では、非アクティブ接続タイムアウトの構成を示します。

pds.setInactiveConnectionTimeout(60);

4.4.6 問合せタイムアウトの設定

Oracle Database 12cリリース2 (12.2.0.2)以降、UCPはqueryTimeoutプロパティを導入しています。このプロパティでは、UCPがStatementオブジェクトの実行を待機する秒数を指定します。この制限を超えると、DatabaseExceptionがスローされます。次の方法でこのプロパティを設定するsetQueryTimeoutメソッドを使用します。

...
PoolDataSourceImpl pds = new PoolDataSourceImpl();
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL(<url>);
pds.setUser("scott");
pds.setPassword(<password>);
pds.setConnectionPoolName("my_pool");
pds.setQueryTimeout(60); // 60 seconds to wait on query
...

4.4.7 タイムアウト・チェック間隔の設定

タイムアウト・チェック間隔プロパティは、タイムアウト・プロパティ(中止接続タイムアウト、TTL接続タイムアウトおよび非アクティブ接続タイムアウト)が適用される頻度を制御します。タイムアウトした接続は、タイムアウト・チェック・サイクルの実行時に回収されます。つまり、接続のタイムアウト時に、実際には接続がプールに回収されないことがあります。接続のタイムアウトと実際の接続の回収の間のラグ・タイムは、タイムアウト・チェック間隔の長さによっては非常に大きい場合があります。

タイムアウト・チェック間隔プロパティは秒単位です。デフォルト値は30に設定されます。次の例では、プロパティ・チェック間隔の構成を示します。

pds.setTimeoutCheckInterval(60);

関連項目:

Oracle Net Servicesの詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。