30 透過的アプリケーション・フェイルオーバー
この章の構成は、次のとおりです。
30.1 透過的アプリケーション・フェイルオーバーの概要
透過的アプリケーション・フェイルオーバー(TAF)は、Java Database Connectivity(JDBC)Oracle Call Interface(OCI)ドライバの機能の1つです。この機能により、接続先のデータベース・インスタンスに障害が発生した場合でも、アプリケーションはデータベースに自動的に再接続できます。この場合、アクティブ・トランザクションはロールバックされます。
接続先インスタンスで障害が発生したり、このインスタンスがシャットダウンしたりすると、クライアント側の接続が無効になり、その接続を使用しようとしたコール元に例外が表示されます。TAFにより、アプリケーションは、事前に構成した2次インスタンスに透過的に再接続し、最初の元のインスタンスで確立したのと同じ接続を新たに作成します。つまり、この接続プロパティは、直前の接続のプロパティと同じです。接続がどのように切断されても関係ありません。
ノート:
-
TAFは常にアクティブなので、設定する必要はありません。
-
TAFはLOB型およびXML型でサポートされていません。
30.2 フェイルオーバー・タイプ・イベント
OracleOCIFailover
インタフェースで発生する可能性があるフェイルオーバー・イベントは、次のとおりです。
-
FO_SESSION
tnsnames.ora
ファイルCONNECT_DATA
フラグのFAILOVER_MODE=SESSION
に相当します。この結果、サーバー側ではユーザー・セッションのみが再度認証され、一方OCIアプリケーションのオープン・カーソルは再実行する必要があります。 -
FO_SELECT
tnsnames.ora
ファイルCONNECT_DATA
フラグのFAILOVER_MODE=SELECT
に相当します。サーバー側でユーザー・セッションが認証されるのみでなく、OCIのオープン・カーソルもフェッチを続行できます。これは、クライアント側のロジックで各オープン・カーソルのフェッチ状態が保持されることを意味します。 -
FO_NONE
tnsnames.ora
ファイルCONNECT_DATA
フラグのFAILOVER_MODE=NONE
に相当します。これはデフォルトで、フェイルオーバー機能は使用されません。フェイルオーバーが実行されないように、明示的に指定することもできます。さらに、FO_TYPE_UNKNOWN
は、OCIドライバから不正なフェイルオーバー型が戻されたことを意味します。 -
FO_BEGIN
フェイルオーバーで失われた接続が検出され、フェイルオーバーが開始されることを意味します。
-
FO_END
フェイルオーバーの正常な完了を示します。
-
FO_ABORT
フェイルオーバーが失敗し、再試行できないことを意味します。
-
FO_REAUTH
ユーザー・ハンドルが再認証されたことを意味します。
-
FO_ERROR
フェイルオーバーが一時的に失敗したが、アプリケーションでエラーを処理してフェイルオーバーを再試行できることを意味します。
sleep
メソッドを発行した後、値FO_RETRY
を戻して再試行するのが、エラー処理の一般的な方法です。 -
FO_RETRY
アプリケーションでフェイルオーバーを再試行することを意味します。
-
FO_EVENT_UNKNOWN
不正なフェイルオーバー・イベントを意味します。
30.3 TAFコールバック
TAFコールバックは、1つのデータベース接続に障害が起きた場合に、別のデータベース接続にフェイルオーバーする際に使用されます。TAFコールバックは、フェイルオーバーが発生したときに登録されるコールバックです。コールバックは、フェイルオーバー中にイベントが発生したことをJDBCアプリケーションに通知するためにコールされます。アプリケーション側でもフェイルオーバーをある程度制御できます。
ノート:
コールバックの設定はオプションです。
30.4 Java TAFコールバック・インタフェース
OracleOCIFailover
インタフェースには、次の型とイベントをサポートするcallbackFn
メソッドが含まれます。
public interface OracleOCIFailover{ // Possible Failover Types public static final int FO_SESSION = 1; public static final int FO_SELECT = 2; public static final int FO_NONE = 3; public static final int; // Possible Failover events registered with callback public static final int FO_BEGIN = 1; public static final int FO_END = 2; public static final int FO_ABORT = 3; public static final int FO_REAUTH = 4; public static final int FO_ERROR = 5; public static final int FO_RETRY = 6; public static final int FO_EVENT_UNKNOWN = 7; public int callbackFn (Connection conn, Object ctxt, // ANy thing the user wants to save int type, // One of the possible Failover Types int event ); // One of the possible Failover Events
FO_ERRORイベントの処理
新しい接続にフェイルオーバーするときにエラーが発生した場合、JDBCアプリケーションはそのフェイルオーバーを再試行できます。一般に、アプリケーションは一度スリープ状態に入った後、コールバックでFO_RETRY
を戻すことで、無限または一定の時間のみ再試行します。
FO_ABORTイベントの処理
登録されたコールバックは、FO_ERROR
イベントが渡された場合、FO_ABORT
イベントを戻す必要があります。
30.5 TAFと高速接続フェイルオーバーの比較
透過的アプリケーション・フェイルオーバー(TAF)と高速接続フェイルオーバーは、次の点で異なります。
-
アプリケーションレベルでの接続の再試行
TAFでは、接続の再試行はOCI/Netレイヤーでのみサポートしています。高速接続フェイルオーバーは、アプリケーションレベルでの接続の再試行をサポートしています。これにより、アプリケーションは接続のフェイルオーバーへの対応を制御できます。アプリケーションは接続を再試行するか、または例外を再発生させるかを選択できます。
-
ユニバーサル接続プールとの統合
TAFは、接続単位でネットワーク・レベルで動作するため、接続キャッシュに障害の発生を通知できません。高速接続フェイルオーバーはユニバーサル接続プールと高度に統合されているため、Connection Cache Managerはキャッシュを管理して高可用性を維持できます。たとえば、障害が発生した接続は、キャッシュ内で自動的に無効になります。
-
イベントベース
高速接続フェイルオーバーは、Oracle RACイベント・メカニズムに基づいています。したがって、高速接続フェイルオーバーは効率的で、アクティブおよび非アクティブな接続の両方で障害をすばやく検出できます。
-
ロード・バランシングのサポート
高速接続フェイルオーバーは、接続の
UP
イベント・ロード・バランシング、およびアクティブなOracle RACインスタンス間での実行時作業要求分散をサポートしています。
ノート:
TAFと高速接続フェイルオーバーを同じアプリケーションで使用しないことをお薦めします。