次の方法で共有


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

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

アダプターには、Oracle データベースをポーリングする 2 つの方法があります。

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

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

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

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

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

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

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

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

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

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

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

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

    Note

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

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

    重要

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

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

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

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

ポーリングと通知の違い

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

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

詳細情報は、次のとおりです。

参照

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