ヘッダーをスキップ
Oracle Database JDBC開発者ガイド
11gリリース2(11.2)
B56281-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

27 高速接続フェイルオーバー

高速接続フェイルオーバーは、Oracle Database 11gの接続フェイルオーバー機能を、Java Database Connectivity(JDBC)アプリケーションがドライバに依存せずに利用できる方法を提供します。この章では、次の概念について説明します。


注意:


高速接続フェイルオーバーの概要

高速接続フェイルオーバー・メカニズムは、暗黙的接続キャッシュ機能に依存しています。暗黙的接続キャッシュの詳細は、第21章「暗黙的接続キャッシュ」を参照してください。

高速接続フェイルオーバーの利点は、次のとおりです。

高速接続フェイルオーバーの機能

高速接続フェイルオーバーを使用可能にすると、次の機能が提供されます。

高速接続フェイルオーバーの使用

アプリケーションは、DataSourceインスタンスを通じて高速接続フェイルオーバーを管理します。

この項の内容は次のとおりです。

高速接続フェイルオーバーの前提条件

高速接続フェイルオーバーを使用するには、次の前提条件を満たしている必要があります。

  • 暗黙的接続キャッシュが使用可能であること

    高速接続フェイルオーバーは、JDBC接続キャッシュ・メカニズムとの組合せで動作します。これにより、アプリケーションは接続を管理して高可用性を確保します。

  • アプリケーションがデータベースへの接続にサービス名を使用していること

    アプリケーションはサービス識別子を使用できません。

  • 基礎となるデータベースには、Oracle Database 11g Real Application Clusters(Oracle RAC)機能、または単一インスタンス・データベースかOracle RACのいずれかで構成されたOracle Data Guardがあること

    フェイルオーバー・イベントが伝播しないと、接続フェイルオーバーは発生しません。

  • JDBCが稼働しているノードでOracle Notification Service(ONS)が構成されており、使用可能であること

    JDBCは、データベース・イベントの伝播およびJDBCへのイベントの通知を行うために、ONSに依存しています。

  • JDBCインスタンスが稼働しているJava仮想マシン(JVM)で、oracle.ons.oraclehomeORACLE_HOMEを指すように設定されていること

高速接続フェイルオーバー用のONSの構成

高速接続フェイルオーバーを使用するには、ONSを正しく構成する必要があります。ONSは、Oracle Database 11gの一部として出荷されます。詳細は、「ONSの構成」を参照してください。

リモートONSサブスクリプション

リモートONSサブスクリプションの利点は次のとおりです。

  • すべてのJava中間層スタックに対するサポート

  • クライアント・コンピュータではONSデーモンが必要ないので、このプロセスの管理が不要

  • DataSourceプロパティを使用した簡単な構成

高速接続フェイルオーバーに対してリモートONSサブスクリプションを使用すると、アプリケーションはOracleDataSourceインスタンスの次のメソッドをコールします。

setONSConfiguration(String remoteONSConfig)

remoteONSConfigパラメータは、name=valueという形式の名前と値のペアのリストで、改行記号(\n)で区切られます。ここで、namenodeswalletfileまたはwalletpasswordのいずれかです。このパラメータには、少なくともnodesONS構成属性を指定してください。これはhost:portペアのリストで、各ペアはカンマ(,)で区切ります。ホストとポートは、Oracle RACノードで利用できるリモートONSデーモンを示します。


関連項目:

「ONSの構成」

Oracle Walletファイルとしてwalletfile属性が指定されると、ONSデーモンとの通信にSSLが使用される可能性があります。そのような場合、walletpassword属性が指定されなければ、シングル・サインオン(SSO)とみなされます。

次にいくつかの例を示します。odsOracleDataSourceインスタンスであるとします。

ods.setONSConfiguration("nodes=racnode1.example.com:4200,racnode2.example.com:4200");

ods.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/mydir/Wallet\nwalletpassword=mypasswd");

ods.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/mydir/conf/Wallet");

高速接続フェイルオーバーを使用可能にする

アプリケーションは、DataSourceインスタンスから接続を取り出す前に、そのインスタンスに対してsetFastConnectionFailoverEnabled(true)をコールすることにより、高速接続フェイルオーバーを使用可能にします。

接続キャッシュを再初期化するときには高速接続フェイルオーバーを使用可能にできません。OracleDataSourceインスタンスを使用する前に使用可能にする必要があります。

例27-1に、高速接続フェイルオーバーを使用可能にする方法を示します。


注意:

キャッシュで高速接続フェイルオーバーを使用可能にすると、そのキャッシュの存続期間中は高速接続フェイルオーバーを使用不可にできません。

高速接続フェイルオーバーを使用可能にするには、次の操作が必要です。

  • ONSを構成し起動します。ONSが正しく設定されていない場合、暗黙的接続キャッシュの作成は失敗し、最初のgetConnectionリクエストでONSExceptionがスローされます。

  • OracleDataSourceに対して最初のgetConnectionリクエストを送信する前に、FastConnectionFailoverEnabledプロパティを設定します。高速接続フェイルオーバーが使用可能になっている場合、フェイルオーバーは接続キャッシュ内のすべての接続に適用されます。アプリケーションがConnection Cache Managerを使用して明示的に接続キャッシュを作成する場合、接続を取り出す前にFastConnectionFailoverEnabledを設定する必要があります。

  • OracleDataSource urlプロパティを設定する際、サービス識別子ではなくサービス名を使用してください。

例27-1 高速接続フェイルオーバーの有効化

// declare datasource
ods.setUrl(
"jdbc:oracle:oci:@(DESCRIPTION=
  (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias)
    (PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=service_name)))");
ods.setUser("scott");
ods.setConnectionCachingEnabled(true);
ods.setFastConnectionFailoverEnabled(true):
ctx.bind("myDS",ods);
ds=(OracleDataSource) ctx.lookup("MyDS");
try {
 ds.getConnection();  // transparently creates and accesses cache
 catch (SQLException SE {
  }
}
...

高速接続フェイルオーバーのステータスの問合せ

アプリケーションは、高速接続フェイルオーバーが使用可能になっているかどうかを判断するために、OracleDataSource.getFastConnectionFailoverEnabledをコールします。フェイルオーバーが使用可能な場合はtrueが、それ以外の場合はfalseが戻されます。

高速接続フェイルオーバーについて

高速接続フェイルオーバーを使用可能に設定すると、メカニズムは自動なので、アプリケーションによる操作は必要ありません。この項では、接続フェイルオーバーがアプリケーションに提示される仕組みと、アプリケーションによるリカバリの手順を説明します。

この項の内容は次のとおりです。

アプリケーションによる認識

Oracle RACサービス障害がJDBCアプリケーションに伝播される前に、データベースはローカル・トランザクションをすでにロールバックしています。次に、キャッシュ・マネージャがすべての無効な接続をクリーン・アップします。無効な接続を保持しているアプリケーションがその接続を通して機能しようとすると、「SQLException, ORA-17008, クローズされた接続です。」を受け取ることがあります。

アプリケーションが「クローズされた接続です。」エラー・メッセージを受信した場合、次のことを実行する必要があります。

  1. 接続要求を再試行します。古い接続はオープンでないため、これは必須です。

  2. トランザクションを再実行します。接続がクローズする前に実行された作業はすべて失われています。


注意:

アプリケーションによってトランザクションをロールバックしないでください。アプリケーションが例外を受信した時点で、トランザクションはすでにデータベースでロールバックされています。

実行される処理

高速接続フェイルオーバーでは、キャッシュ内の各接続はサービス、インスタンス、データベースおよびホスト名へのマッピングを維持します。

データベースがOracle RACイベントを生成すると、そのイベントはJDBCが稼働中であるJVMに転送されます。JVM内のデーモン・スレッドがOracle RACイベントを受信し、それをConnection Cache Managerに転送します。次に、Connection Cache ManagerはOracle RACイベントの影響を受けるアプリケーションに対してSQL例外を発行します。

一般的なフェイルオーバーの例を次に示します。

  1. データベース・インスタンスで障害が発生し、キャッシュ内にいくつかの失効した接続が残ります。

  2. データベース内のOracle RACメカニズムがOracle RACイベントを生成し、そのイベントはJDBCが含まれているJVMに送信されます。

  3. JVM内のデーモン・スレッドはOracle RACイベントの影響を受けるすべての接続を検出し、SQL例外によって接続がクローズされたことを通知し、オープンなトランザクションがあればすべてロールバックします。

  4. 各接続はSQL例外を受信し、再試行します。

高速接続フェイルオーバーとTAFの比較

高速接続フェイルオーバーと透過的アプリケーション・フェイルオーバー(TAF)は、次の点で異なります。


注意:

TAFと高速接続フェイルオーバーを同じアプリケーションで使用しないことをお薦めします。