バンド内ドレイン通知のアプリケーション要件

バンド内通知の使用時にセッションをドレインできるように、アプリケーション・サーバー、ドライバ・バージョンおよび接続プールが正しく構成されていることを確認してください。

Oracle UCP

接続プールのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

23.5.0.24.7以降

23.5.0.24.7以降

デフォルト設定を使用します

優先バージョン

19.12以降

19.12以降

UCPプロパティsetValidateConnectionOnBorrow(true)を設定します

なお、検証モードは複数あり、ドライバ設定を使用してモードを設定できます。

これらの推奨される変更を加えた場合、ドレインは、接続チェックアウト時(beginRequest)とチェックイン時(endRequest)に発生します

UCPでは、setValidateConnectionOnBorrow(true)の使用時にネットワーク・ラウンドトリップを必要としない軽量接続チェックがJDBCで使用されていることが確認されます。

19.11以前

19.11以前

最新ドライバに、または最小でもドライバ・バージョン19.12にアップグレードします

推奨構成ではありません

使用可能なバンド内通知はありません。ONSベースのFANが使用されていないかぎり、ドレインはできません

WebLogic

WebLogic Generic、WebLogic MDSおよびWebLogic AGLが含まれます。

アプリケーション・サーバーとOracleドライバ・バージョンの組合せ 推奨構成の設定 コメント

12.2.1.4と19.12以降

12.1.1.6と19.12以降

14.1.1と19.12以降

14.1.2と23.5.0.24.7以降

WLSのすべてのバージョンで、バグ35731335に対する修正が必要です

次のパラメータは必須です:

test-connections-on-reserve=true

test-table-name=SQL ISVALID (デフォルト: null)

seconds-to-trust-an-idle-pool-connection=0 (デフォルト: 10)

test-frequency-seconds (デフォルト: 120秒、アイドル接続)

count-of-refresh-failures-till-disable=0 (デフォルト: 2)

count-of-test-failures-till-flush=0 (デフォルト: 2)

デフォルトでは、ドレインは、endRequestでの接続チェックイン時に発生可能です。

推奨される設定では、ドレインは、beginRequestでの接続チェックアウト時にも発生可能です。

12.2.1.4とOracle 19.11以前

最新Oracleドライバに、または最小でもドライバ・バージョン19.12にアップグレードします

推奨構成ではありません

使用可能なバンド内通知はありません。FANがある場合を除きドレインはできません

JDBC

サードパーティ・プールで使用されているかカスタム・コードで直接使用されているJDBCに適用されます。

Oracleドライバのバージョン 推奨構成の設定 コメント

19.12以降

  • JDBCドライバはプーリング・アクションを把握していないため、それで安全にドレインできる箇所は、"安全なドレイニングを行うAPI"のどれかがコールされたときのみです。

    サードパーティ・プールにより、チェックアウト時に接続を検証するプール・プロパティ(プールによって異なる。後述のHikariとTomcatの例を参照)、またはOracle JDBCドライバを直接コールするアプリケーションを追加する必要があります。

    • java.sql.Connection.isValid(int timeout)

    • oracle.jdbc.OracleConnection.pingDatabase()

    • oracle.jdbc.OracleConnection.pingDatabase(int timeout)

    • oracle.jdbc.OracleConnection.endRequest()

    APIのリスト: 計画済メンテナンス用の安全なドレイニングAPI

  • 別の方法として、beginRequestendRequestを使用するアプリケーションにより、安全なドレイン・ポイントが使用されるようにすることができます

  • Oracle JDBCドライバをコールするサードパーティ・プールまたはアプリケーション:

    任意のOracle JDBCドレインAPI (前述)をコールし、軽量接続検証プロパティ(プールに適用可能な場合)をSOCKETに設定します(「特定のドライバとプールの場合のFANの構成」を参照)

  • Oracle JDBCドライバをコールしないサードパーティ・プールまたはアプリケーション:

    SQLを、draining-hintとともに、またはDBA_CONNECTION_TESTS内で実行します

これらの推奨される変更を加えた場合、ドレインは、接続チェックアウト時とチェックイン時(endRequestが使用されている場合)に発生します

ACまたはTACを使用している場合はOracle JDBC 19.15が推奨されており、計画フェイルオーバーはbeginRequestで動作します。

19.11以前

最新ドライバに、または最小でもドライバ・バージョン19.12にアップグレードします

推奨構成ではありません

使用可能なバンド内通知はありません。ドレインはできません

Hikari

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

6.0

19.21以降

次のプロパティを使用した場合、ドレインはendRequestで発生します(次のプロパティによって有効化される):

System.setProperty("com.zaxxer.hikari.aliveBypassWindowMs", "-1")

また、次を使用して検証レベルを設定します:

setProperty("oracle.jdbc.defaultConnectionValidation", "SOCKET");

com.zaxxer.hikari.enableRequestBoundariestrueに設定されます

これらの推奨される変更を加えた場合、ドレインは、接続チェックアウト時(beginRequest)とチェックイン時(endRequest)に発生します

6.0より前

19.21以降

Hikari 6.0にアップグレードします

推奨構成ではありません

リクエスト境界なし - デフォルトではドレインなし

.NET

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

現在サポートされている任意のバージョン

ODP.NET Core 19.9以降

デフォルト設定を使用します

ODP.NETのバンド内FAN通知では、次の使用シナリオがサポートされています:

  • プラガブル・データベースの再配置

  • データベース・サービスの再配置

  • データベースのローリング・アップグレード

  • Connection Manager計画メンテナンス

Oracle Database 18c以上でサポートされています。

.NET Framework

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

現在サポートされている任意のバージョン

管理対象ODP.NET 19.9以降

管理対象外ODP.NET 19.10以降

ODP.NETではデフォルトでオン

ODP.NETのバンド内FAN通知では、次の使用シナリオがサポートされています:

  • プラガブル・データベースの再配置

  • データベース・サービスの再配置

  • データベースのローリング・アップグレード

  • Connection Manager計画メンテナンス

Oracle Database 18c以上でサポートされています。

Tomcat

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

9.0, 10.0, 11.0

任意のバージョン

UCPとともにTomcatを使用している場合は、前述のUCPの推奨事項に従ってください。

Oracle JDBCドライバまたはOracle DBCPとともにTomcatを使用している場合:

  • 接続の流用時と返却時に任意のOracle JDBCドレインAPI (isValid()isUsable()pingDatabase()endRequest())をコールします。

  • 軽量接続検証プロパティをSOCKETに設定します:

    setProperty("oracle.jdbc.defaultConnectionValidation", "SOCKET");

これらの推奨される変更を加えた場合、ドレインは、接続チェックアウト時(beginRequest)とチェックイン時(endRequest)に発生します

UCPでは、デフォルトで、軽量接続テスト(SOCKET)が使用されます。

9.0, 10.0, 11.0

任意のバージョン

Oracle JDBCドライバをコールしないサードパーティ・プールまたはアプリケーション:

  • 流用時と返却時に接続検証を有効にします

  • isValid()を使用するか、SQLを、draining-hintとともに、またはDBA_CONNECTION_TESTS内で実行します

これらの推奨される変更を加えた場合、ドレインは、接続チェックイン時(endRequestが使用されている場合)に発生します

JBOSS

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

EAP 7.3.9以降

19.12以降

  • "一致時に検証"を使用して、チェックアウトのたびに接続を検証します
  • バックグラウンド検証を使用しないでください
  • "プールのパージの無効化またはプールの破棄の無効化"を構成しないでください

「特定のドライバとプールの場合のFANの構成」も参照してください

validation-SQLがないと、適切に構成されたネイティブ・プールにより、チェックアウトのたびに(各接続の検証によって)、また、チェックイン時に(JBOSSによるendRequestコールによって自動的に)ドレインされる場合があります。

EAP 7.3.9より前のバージョン

19.12以降

  • "一致時に検証"を使用して、チェックアウトのたびに接続を検証します
  • バックグラウンド検証を使用しないでください
  • "プールのパージの無効化またはプールの破棄の無効化"を構成しないでください

「特定のドライバとプールの場合のFANの構成」も参照してください

validation-SQLがない場合は、適切に構成されたネイティブ・プールにより、チェックアウトのたびに(接続の検証によって)ドレインされます。

アプリケーションによってJDBCのendRequestがコールされている場合は、チェックイン時にもドレインされる場合があり、そうでない場合にはドレインされません。

詳細は、JDBCドライバの要件を参照してください。

長時間実行PL/SQL

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

Oracle Database 19以上

該当なし

次のSQLを使用して、バッチ間のドレイン・ステータスをテストします。

この目的は、ドレイン状態を確認することです。ドレイン状態が検出された場合は、その接続をクローズし、新しい接続を取得します。

  • ドレインが進行中のとき:

    SQL> select SYS_CONTEXT('USERENV', 'DRAIN_STATUS') from dual ;

    戻り値: DRAINING

  • ドレインされていないとき:

    SQL> select SYS_CONTEXT('USERENV', 'DRAIN_STATUS') from dual ;

    戻り値: NONE

デフォルトでは、ドレインされません。バッチ間隔で、推奨されているSQLを使用する必要があります。

これは、バッチ間隔がドレイン・タイムアウト間隔の1/2より小さい場合に機能します。

OCIベースのアプリケーション

Pro*C/C++、Pro*COBOLおよびpython-oracledbのThickモード。

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定 コメント

Oracle Database 19以上

Oracle Database 19以上

  • OLTPスタイルのアプリケーションの場合は、さらに構成する必要はありません

  • 長時間実行アプリケーションでは、次のOracle Call Interface OCIAttrGetの例を使用して、バッチ間のドレイン・ステータスをテストし、ドレインが検出されたときには新しいセッションを取得する必要があります。接続状態が検出されない場合は、その接続をクローズし、新しい接続を取得します。

    ub4 serverStatus = 0
    OCIAttrGet((dvoid *)srvhp, OCI_HTYPE_SERVER,
       (dvoid *)&serverStatus, (ub4 *)0, OCI_ATTR_SERVER_STATUS, errhp);
    if (serverStatus == OCI_SERVER_NORMAL)
       printf("Continue. Connection is up.\n");
    else if (serverStatus == OCI_SERVER_NOT_CONNECTED)
       printf("close your session and get another .\n");

    これは、バッチ間隔がドレイン・タイムアウト間隔の1/2より小さい場合に機能します。

ドレインは、OCIのOCIセッション・プール、およびThickモードのpython-oracledbからのチェックアウト時に発生します。ドレインは、明示的なリクエスト境界(OCIアプリケーションの場合はOCIRequestBegin、Pro*/C++およびPro*COBOLアプリケーションの場合はEXEC SQL REQUEST BEGIN)で発生します。

長時間実行アプリケーションにより、ここにある「推奨構成の設定」で示すようにドレイン・ステータスをテストする必要があります。

長時間実行JDBC

アプリケーション・サーバーのバージョン Oracleドライバのバージョン 推奨構成の設定

Oracle Database 19以上

Oracle Database 19以上

  • 次の接続テストを使用して、バッチ間のドレイン・ステータスをテストします。ドレイン状態が検出された場合は、セッションをクローズし、新しいセッションを取得してから、次のバッチの処理を続行します。

    任意のOracle JDBCドレインAPI (isValid()isUsable()pingDatabase()endRequest())をコールし、軽量接続検証プロパティをSOCKETに設定します:

    setProperty("oracle.jdbc.defaultConnectionValidation", "SOCKET");

  • 別の方法としては、ドレイン中に計画フェイルオーバーを実行するように、透過的アプリケーション・コンティニュイティを構成します(Oracle Database 19.15以上が必要)。