Oracle Database アダプターを使用したデータベース変更通知の受信に関する考慮事項
このトピックでは、Oracle データベース アダプターを使用して Oracle データベースからデータベース通知を受信する際に留意する必要があるいくつかの考慮事項とベスト プラクティスについて説明します。
アダプターを使用して通知を受信する際の考慮事項
Oracle Database アダプターを使用してクエリ通知を受信するときは、次の点を考慮する必要があります。
Oracle Database アダプターは、Oracle データベースから受信した通知をアダプター クライアントに渡すだけです。 アダプターは、異なる操作の通知を区別しません。つまり、特定の通知が Insert 操作または Update 操作に対して行われるかどうかに関する情報はありません。
操作の通知メッセージは、その操作の影響を受けるレコードの数の影響を受けません。 たとえば、Oracle データベース テーブルに挿入されたレコードの数に関係なく、アダプター クライアントは通知メッセージを 1 つだけ受信します。
アダプター クライアント アプリケーションには、Oracle データベースから受信した通知の種類を解釈するロジックが含まれていることをお勧めします。 アダプター クライアント アプリケーションは、受信した通知メッセージの Info> 要素の情報を<抽出することで、これを行うことができます。 挿入操作で受信した通知メッセージの例を次に示します。
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Details> <NotificationDetails> <ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName> <Info>1</Info> <QueryId>0</QueryId> </NotificationDetails> </Details> <Info>Insert</Info> <ResourceNames> <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string> </ResourceNames> <Source>Data</Source> <Type>Change</Type> </Notification>
Info 要素内の値に<注目してください。> この値は、通知メッセージを受信した操作に関する情報を提供します。 アプリケーションには、Info> 要素内<の値を抽出し、その値に基づいて後続のタスクを実行する機能が必要です。 トピック「通知メッセージを処理して Oracle Database で特定のタスクを完了する」では、Info> 要素内<の値を抽出する方法について説明します。
クライアント アプリケーションは、通知を受信した後、通知が既に受信されているレコードを更新して、後続の通知が同じレコードに対して行われるようにするのが理想的です。 たとえば、Processed 列を持つ ACCOUNTACTIVITY テーブルがあるとします。 ACCOUNTACTIVITY テーブルに挿入されたすべての新しいレコードについて、処理済み列の値は常に 'n' です。 たとえば、挿入操作の後、 ACCOUNTACTIVITY テーブル内のレコードは次のようになります。
アカウント トランザクション ID 処理済み 10001 n 新しく挿入されたレコードの通知を取得するために、アダプター クライアントは NotificationStatement バインディング プロパティを次のように設定します。
SELECT * FROM SCOTT.ACCOUNTACTIVITY WHERE PROCESSED = ‘n’
通知を受信した後、クライアント アプリケーションは、通知ステートメントが既に通知されたレコードに対して動作しないように、 処理された 列の値を 'y' に設定する必要があります。 そのため、これを実現するには、クライアント アプリケーションで ACCOUNTACTIVITY テーブルに対して Update 操作を実行する必要があります。 Update 操作の後、 ACCOUNTACTIVITY テーブル内の同じレコードは次のようになります。
アカウント トランザクション ID 処理済み 10001 ○ 興味深いことに、Update 操作は再びアダプター クライアントに通知を送信し、プロセス全体が再度繰り返されます。 そのため、クライアント アプリケーションには、このような不要な通知を破棄するために必要なロジックが必要です。
NotifyOnListenerStart バインディング プロパティが true の場合、アダプターは受信場所が開始されるたびにアダプター クライアントに通知を送信します。 バインディング プロパティを使用して通知メッセージを解釈する方法の詳細については、「 受信場所の内訳後の Oracle データベース変更通知の受信」を参照してください。
通知を受信するための一般的なオーケストレーション
このセクションでは、Oracle Database アダプターを使用して通知を受信するための一般的なオーケストレーション フローについて説明します。
オーケストレーションで最初に行う必要があるのは、受信した通知の種類をチェックすることです。 チェックする対象は次のとおりです。
受信場所の通知を受信したかどうか再起動します。
挿入、更新、削除など、データベース テーブルに対する操作に関する通知を受信したかどうか。
受信するメッセージの種類を決定するには、オーケストレーションに 式 図形を含め、その中に xpath クエリを含める必要があります。
通知の種類が使用可能になった後、オーケストレーションには、受信した通知の種類に基づいて特定のアクションを実行するための決定ブロックを含める必要があります。 これを実現するには、オーケストレーションに [決定] 図形を含める必要があります。 [決定] 図形は、Rule ブロックと Else ブロックで構成されます。 Rule ブロック内で条件を指定し、条件が満たされた場合に特定の操作を実行するオーケストレーション図形を含める必要があります。 Else ブロック内では、条件が満たされない場合に特定の操作を実行するためにオーケストレーション図形を含める必要があります。
前述の推奨事項については、「BizTalk Serverを使用して Oracle Database で特定のタスクを完了するための通知メッセージの処理」で詳しく説明されています。