次の方法で共有


Oracle Database でのポーリング ベースのデータ変更メッセージの受信のサポート

TheOracle Database adapter を使用すると、クライアント プログラムは、Oracle データベースに格納されているデータに対する変更を通知するメッセージを Oracle データベースから受信できます。 Oracle Database アダプターは、指定された SELECT クエリ、ストアド プロシージャ、関数、または関数をパッケージ内で実行し、データを取得し、一定の間隔でクライアントに結果を提供する"ポーリング ベース" メッセージの受信をサポートします。 これを有効にするために、Oracle データベース アダプターは POLLINGSTMT 操作を公開します。 さらに、パッケージ内のすべてのストアドプロシージャ、関数、およびパッケージ内のプロシージャと関数は、ポーリングの受信操作として公開されます。

アダプターは、Oracle データベースをポーリングする 2 つの方法を提供します。

  • SELECT ステートメントの使用。 Oracle データベース内のテーブルとビューをポーリングする単純な SELECT ステートメントを指定できます。 アダプターは、指定された間隔で SELECT ステートメントを実行し、結果をアダプター クライアントに返します。

  • パッケージ内でストアド プロシージャ、関数、またはプロシージャまたは関数を使用する。 パッケージ内でストアド プロシージャ、関数、またはプロシージャまたは関数を指定して、Oracle データベースをポーリングできます。 アダプターは、指定された間隔で要求メッセージを実行し、結果をアダプター クライアントに返します。

ポーリング操作ワークフロー

Oracle データベース アダプターを使用する一般的なポーリング操作には、次のものが含まれます。

  1. アダプター クライアントは、InboundOperationType バインディング プロパティの受信操作としてポーリングを指定する必要があります。 このバインディング プロパティの既定値は ポーリングです。

  2. アダプター クライアントは、ポーリングに使用できるデータがあるかどうかを判断するために、 PolledDataAvailableStatement バインディング プロパティの SELECT ステートメントを指定する必要があります。 このステートメントの実行時に、返される結果セットの最初の行の最初の列に正の整数値が含まれている場合は、ポーリングに使用できる日付があります。 既定では、このバインディング プロパティの値は Select 1 FROM DUAL に設定されます。つまり、ポーリング対象のテーブルにデータがあるかどうかに関係なく、アダプターはポーリングを続行する必要があります。

  3. アダプター クライアントは、PolledDataAvailableStatement バインディング プロパティで指定されたステートメントが実行される間隔を秒単位で定義するために、PollingInterval バインディング プロパティのポーリング間隔を指定する必要があります。 ポーリング間隔の終了時に、ポーリングされたデータの使用可能なステートメントが実行され、結果セットが返されます。

  4. アダプター クライアントは、 PollingStatement バインディング プロパティの SELECT ステートメントまたはストアド プロシージャを指定する必要があります。

    • テーブルまたはビューをポーリングする場合は、このバインド プロパティで SELECT クエリを指定する必要があります。

    • パッケージ内のストアド プロシージャ、関数、またはプロシージャまたは関数を使用してポーリングする場合は、このバインド プロパティでそれぞれの操作の要求メッセージ全体を指定する必要があります。

      PollingStatement バインディング プロパティのステートメントは、ポーリングに使用できるデータがある場合にのみ実行されます。これは、手順 1 の PolledDataAvailableStatement バインディング プロパティによって決定されます。

  5. アダプター クライアントは 、PollingAction バインディング プロパティでポーリング操作のアクションを指定する必要があります。 特定の操作のポーリング アクションは、Consume Adapter Service アドインを使用して操作に対して生成されたメタデータから決定されます。

    PollingStatement バインディング プロパティで SELECT ステートメントを使用してテーブルまたはビューをポーリングする場合は、PollingAction バインディング プロパティの値を指定する必要はありません。 この場合、既定値 Null が渡されます。

  6. アダプター クライアントは 、PollWhileDataFound バインディング プロパティを使用してポーリング間隔を無視し、使用可能な場合と同様にデータを継続的にポーリングできます。

    Von Bedeutung

    PollWhileDataFound バインド プロパティの値を True に設定すると、アダプター クライアントは Oracle からデータを継続的にポーリングし、プロセスでループ内で Oracle データベースへの接続を開いたり閉じたりします。 ODP.NET によって接続が開かれる速度が接続を閉じる速度を超えると、接続がしばらくすると使い果たされ、例外がスローされます。 回避策として、 UseOracleConnectionPool の値が True に設定されていることを確認し、アダプター クライアントが開くことができる接続の数を制御するための適切な値が IncrPoolSize バインド プロパティに記載されていることを確認します。

  7. アダプター クライアントは、 PostPollStatement バインディング プロパティに対して、ポーリング後ステートメント (Oracle PL/SQL ブロック) を指定できます。 このバインディング プロパティで指定されたステートメントは、 PollingStatement バインディング プロパティで指定されたステートメントが実行された後に実行されます。

    アダプターはポーリング ステートメントとポーリング後ステートメントをトランザクションでラップし、トランザクション タイムアウト値は PollingInterval バインディング プロパティに指定された値として設定されます。 そのため、受信メッセージの処理と応答の送信に必要な時間以上のタイムアウト値を指定することが重要です。 クライアント プログラムがメッセージを使用するか、ポーリング後クエリを実行するのにかかった時間がタイムアウト値を超える場合、トランザクションはロールバックされます。 所要時間がタイムアウト値より小さい場合、アダプターはトランザクションをコミットし、ポーリングの残りの時間は "スリープ" してから、次のポーリングを実行します。

    アダプターは、Oracle データベースからの空のポーリング応答を抑制します。

ポーリングと通知の違い

ポーリングと通知はどちらも受信操作であり、Oracle データベースのデータ変更についてアダプター クライアントに通知しますが、次の表に、2 つの違いをいくつか示します。 次の違いは、要件に応じて操作を決定するのに役立ちます。

ポーリング 通知
ポーリングは、Oracle データベース アダプターでサポートされているすべての Oracle データベース バージョンでサポートされます。 通知は、Oracle データベース バージョン 10.2 以降でのみサポートされます。
ポーリング間隔を構成して、一定の間隔でポーリングに使用できるデータを確認するか、データが使用可能な場合と同じように瞬時に確認できます。 ヒント: ポーリングを使用すると、データの変更が継続的に行われている状況で、スループットを向上させることができます。データが変更されるたびに通知を受ける必要がない場合に有効です。 代わりに、前回の変更通知以降に発生したすべての変更を通知するポーリング間隔を指定します。 データ変更通知は常に瞬時に行われます。
ポーリングはアダプターによって開始されます。 アダプターは SQL ステートメントを実行して、データがポーリングに使用できるかどうかを検証し、ポーリングに使用できるデータがある場合はポーリング ステートメントを実行してポーリングを開始します。 通知は Oracle データベースによって開始されます。 アダプターによって発行された通知ステートメントは、ステートメントの結果セットに変更がある場合に通知を開始するようにデータベースに指示するだけです。 通知は Oracle データベースの機能です。
ポーリング ステートメントを使用して、Oracle データベース内のデータの読み取りまたは更新を行うことができます。 通知ステートメントを使用すると、Oracle データベース内のデータのみを読み取ることができます。
ポーリングでは、変更された実際のデータについて通知されます。 通知は、挿入、更新、削除などのデータの変更の種類についてのみ通知します。

詳細については、次の情報を参照してください。

こちらもご覧ください

アダプターを使用して実行できる操作