アプリケーション・コンティニュイティ
Oracle Application Continuityを使用すると、データベース・セッションが切断され、リカバリ可能なエラーになった場合に、トランザクションおよび非トランザクション操作を、データベース・リクエストで自動的に非破壊的かつ迅速にリプレイできます。アプリケーション・コンティニュイティは、計画および計画外の関連エラーをマスクして、エンド・ユーザーの操作性を改善します。リカバリ可能なエラー時にデータベース操作を自動的にリプレイして、例外処理の複雑なロジックを必要とせずにアプリケーションを開発できます。
アプリケーション・コンティニュイティを使用しない場合、安全で信頼性の高い方法で停止をマスクすることは、ほぼできません。一般的には、次のような問題が発生します。
-
入力したデータ、戻されたデータおよび変数がキャッシュされ、データベースの状態が失われたまま、クライアントの状態は現時点のままになります。
-
トランザクションのコミットを実行した場合、コミット・メッセージが永続でなくなります。また、紛失したリクエストをチェックしても、チェック後にコミットされないという保証はされません。
-
非トランザクション・データベース・セッション状態は失われます。
-
リクエストが続行可能である場合は、データベースとクライアント・セッションを同期する必要があります。
アプリケーション・コンティニュイティは、共有インフラストラクチャと専用インフラストラクチャの両方のOracle Real Application Clusters (RAC)、Oracle RAC One Node、Oracle Active Data GuardおよびOracle Autonomous Databaseで使用可能な機能です。
Oracle Database 18cでは、アプリケーション・コンティニュイティにより、透過的セッションおよびトランザクション状態の追跡やデータベース・セッションの記録が改善され、リカバリ可能な停止後のリカバリができます。この拡張機能は透過的アプリケーション・コンティニュイティ(TAC)と呼ばれます。TACは、アプリケーションの知識やアプリケーション・コードの変更に依存せず、アプリケーションに対して有効にすることができます。ODP.NETアプリケーションの透過性とフェイルオーバーは、アプリケーションがユーザー・コールを発行するときのセッション状態の使用状況を取得して分類する状態追跡情報を使用することによって実現されます。
ODP.NETとアプリケーション・コンティニュイティ
すべてのODP.NETプロバイダ・タイプ(Core、管理対象および管理対象外)で、アプリケーション・コンティニュイティおよび透過的アプリケーション・コンティニュイティがサポートされています。
ノート:
非同期ODP.NETでは、アプリケーション・コンティニュイティおよび透過的アプリケーション・コンティニュイティはサポートされていません。
アプリケーション・コンティニュイティまたはTACを有効にすると、すべてのアプリケーションで実行される文が、ODP.NETによって間違いなく適切にログに記録されるため、リカバリ可能なエラー時にリプレイすることができます。これは、すべてのアプリケーションのSQLおよびPL/SQLにも、内部ODP.NET操作にも適用されます。
クライアント側では、ODP.NET接続文字列属性Application Continuity=true
を設定して、アプリケーション・コンティニュイティまたはTACを有効にします。この属性は、デフォルトでtrue
に設定されています。
Application Continuity
がtrue
に設定されていて、データベース・サーバーでアプリケーション・コンティニュイティまたはTACを有効にしていない場合でも、ODP.NETは新しい接続を作成します。ただし、これらの接続でApplication Continuity
は有効になりません。
アプリケーション・コンティニュイティとTACの両方をODP.NET接続プールとともに使用するには暗黙的にBeginRequest
/EndRequest
をコールし、ODP.NET接続プールなしで使用するには明示的にBeginRequest
/EndRequest
をコールします。
アプリケーション・コンティニュイティの作業リクエスト
ACとTACはリクエスト境界に作用します。リクエストは、アプリケーションの作業単位です。それは通常は、アプリケーションが接続プール内のデータベース接続を借りてから戻すまでの間に存在します。すべてのODP.NETプロバイダは、デフォルトでこのモデルを使用して、作業リクエスト境界を定めます。
ODP.NET Coreと管理対象ODP.NETには、開発者がOracleConnection
のBeginRequest
およびEndRequest
メソッドを使用してリクエスト境界を明示的に特定するための機能がさらに含まれています。可能な場合は、アプリケーションでこれらのメソッドが必要にならないようにし、デフォルト動作のみで実現されるようにすることをお薦めします。接続がチェックアウトされると、ODP.NETは暗黙的にBeginRequest
をコールします。また、接続がチェックインされると、ODP.NETは暗黙的にEndRequest
をコールします。このモデルにより、適切にスケーリングされ、開発者がACとTACをより簡単に使用できるようになります。
カスタム接続プールを使用する場合など、ODP.NET接続プールを使用しないアプリケーションでは、リクエスト境界を明示的にマークする必要があります。接続のチェックアウト時にBeginRequest
メソッドをコールし、接続のチェックイン時にEndRequest
メソッドをコールする必要があります。
ODP.NETは、リクエスト境界点を把握することで、データベース・コール履歴を安全に解放できるタイミングを判別します。正確にリクエスト境界を特定することで、存続時間の長い接続(それらがカスタム・プール内に存在する場合など)のメモリー消費量を節約できます。
これらのメソッドでは、リソース消費量、リカバリおよびロード・バランシングのパフォーマンスを改善する以外に、アプリケーションへの影響はありません。それらでどのメソッド、SQLまたはPL/SQLがコールされても接続状態は変更されません。
ローカル・トランザクションがオープンされている間にリクエスト開始または終了が発行された場合、ODP.NETはエラーを返します。