スケジュールされたジョブのOracle AQ


0

現在、Oracle DBMS_SCHEDULERを使用して実行するプロセスがあります。このプロセスは、バックエンドが外部デバイスからデータを受信するたびに実行されます。Oracleスケジューラは、外部データの受信時にジョブが作成され、ジョブがすぐに実行され、完了時にジョブが自動的に破棄されるように設定されます。

ここでの問題は、複数のデバイスが同時にデータを送信している可能性があることです。プロセスには、実行中の異なるポイントで排他ロックを取得することが含まれるため、1つのジョブがすでに実行中の別のジョブにステップインする場合があります(ORA-20000で拒否されます)。

この問題を解決するために、Oracle AQ(アドバンスドキュー)メカニズムを何らかの方法で使用したいと思います。FIFOで実行されるジョブのキューを想定しています。プロセスが現在外部デバイスAからのデータを処理している間に外部デバイスBがデータを送信したとしても、キューはデバイスAの処理が完了するまでデバイスBからのデータの処理を防ぎます。

Oracleドキュメントには、このタイプのAQ処理に関する特定のセクションはないようですが、かなり一般的なシナリオのようです。Oracle AQでこの種の問題を解決した人はいますか?

回答:


0

次のように実装できます。スケジューラジョブプログラムは無限として実装され、ループに失敗することはありません。このループは、AQからメッセージを引き出して処理します。スケジューラジョブは、イベントシステムからトリガーまで一度だけ送信されAFTER STARTUP ON DATABASEます。

スケジューラチェーンやその他の高度なスケジューラオプションは使用しません。単純にスケジューラージョブは、データベースにスターが付けられたときにトリガーによって起動され、ジョブは「終了しない」

しかし、dbms_schedulerは最近非常に強力であり、スケジュールの並列実行を制限する方法があると思います。

PS:ORA-20000はユーザー定義のエラーコードです。データベースが独自にこのようなエラーを返すことはありません。


あなたが言及した終わりのないスケジュールされたジョブでこれがどのように機能するかの例(擬似コードまたは同様のもの)を提供できますか?たとえば、AQメカニズムはどのように設定され、複数のプロセスが同時に実行されるのを防ぐにはどうすればよいですか?それは、ジョブまたはAQメカニズムで定義された制限でしょうか?
mlehmeher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.