この章の内容は次のとおりです。
透過的アプリケーション・フェイルオーバー(TAF)は、Java Database Connectivity(JDBC)Oracle Call Interface(OCI)ドライバの機能の1つです。この機能により、接続先のデータベース・インスタンスに障害が発生した場合でも、アプリケーションはデータベースに自動的に再接続できます。この場合、アクティブ・トランザクションはロールバックされます。
接続先インスタンスで障害が発生したり、このインスタンスがシャットダウンしたりすると、クライアント側の接続が無効になり、その接続を使用しようとしたコール元に例外が表示されます。TAFにより、アプリケーションは、事前に構成した2次インスタンスに透過的に再接続し、最初の元のインスタンスで確立したのと同じ接続を新たに作成します。つまり、この接続プロパティは、直前の接続のプロパティと同じです。接続がどのように切断されても関係ありません。
注意: TAFは常にアクティブなので、設定する必要はありません。 |
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
不正なフェイルオーバー・イベントを意味します。
TAFコールバックは、1つのデータベース接続に障害が起きた場合に、別のデータベース接続にフェイルオーバーする際に使用されます。TAFコールバックは、フェイルオーバーが発生したときに登録されるコールバックです。コールバックは、フェイルオーバー中にイベントが発生したことをJDBCアプリケーションに通知するためにコールされます。アプリケーション側でもフェイルオーバーをある程度制御できます。
注意: コールバックの設定はオプションです。 |
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
イベントを戻す必要があります。