Oracle AQ für geplante Jobs

364
mlehmeher

Wir haben einen Prozess, der derzeit Oracle DBMS_SCHEDULER zur Ausführung verwendet. Der Prozess wird jedes Mal ausgeführt, wenn das Backend Daten von einem externen Gerät empfängt. Der Oracle-Scheduler ist so eingerichtet, dass ein Job beim Empfang externer Daten erstellt wird, der Job sofort ausgeführt wird und der Job nach Abschluss automatisch gelöscht wird.

Das Problem hierbei ist, dass mehrere Geräte gleichzeitig Daten senden können. Da der Prozess das Erlangen exklusiver Sperren an verschiedenen Stellen während der Ausführung beinhaltet, wird gelegentlich ein Job auf einen anderen ausgeführt, der bereits ausgeführt wird (er wird mit ORA-20000 zurückgewiesen).

Ich möchte den Oracle AQ-Mechanismus (Advanced Queuing) verwenden, um dieses Problem zu lösen. Ich stelle mir eine Warteschlange von Jobs vor, die FIFO ausgeführt werden. Selbst wenn das externe Gerät B Daten sendet, während der Prozess gerade Daten vom externen Gerät A verarbeitet, verhindert die Warteschlange die Verarbeitung von Daten von Gerät B, bis die Verarbeitung für Gerät A abgeschlossen ist.

Es scheint keinen speziellen Abschnitt zu dieser Art der AQ-Verarbeitung in der Oracle-Dokumentation zu geben, aber es scheint, als wäre dies ein ziemlich übliches Szenario. Hat jemand dieses Problem mit Oracle AQ gelöst?

0

1 Antwort auf die Frage

0
ibre5041

Sie können es folgendermaßen implementieren: Das Scheduler-Jobprogramm ist als Endlos-Schleife implementiert, die niemals fehlschlägt. Diese Schleife zieht Nachrichten von AQ zurück und verarbeitet sie. Der Scheduler-Job wird nur einmal übermittelt - sogar vom Ereignissystem aus AFTER STARTUP ON DATABASE.

Es verwendet keine Schedulerketten oder andere erweiterte Scheduleroptionen. Der Scheduler-Job wird einfach durch den Auslöser ausgelöst, wenn die Datenbank einen Stern hat, der Job "wird nie beendet" .

Aber ich denke, dbms_scheduler ist heutzutage sehr mächtig und es gibt Möglichkeiten, wie man parallele Ausführungen für einen Zeitplan einschränken kann.

PS: ORA-20000 ist ein benutzerdefinierter Fehlercode. Die Datenbank gibt einen solchen Fehler niemals selbst aus.

Können Sie ein Beispiel (Pseudo-Code oder ähnliches) geben, wie dies mit dem von Ihnen erwähnten, nie endenden geplanten Job funktionieren könnte? Wie würde beispielsweise der AQ-Mechanismus eingerichtet und wie würden Sie verhindern, dass mehr als ein Prozess gleichzeitig ausgeführt wird? Wäre das eine Einschränkung im Job oder in der AQ-Mechanik? mlehmeher vor 8 Jahren 0