oracle AQ для запланированных работ

297
mlehmeher

У нас есть процесс, который в настоящее время использует Oracle DBMS_SCHEDULER для выполнения. Процесс запускается каждый раз, когда сервер получает данные от внешнего устройства. Планировщик Oracle настроен таким образом, что задание создается при получении внешних данных, задание выполняется немедленно и задание автоматически уничтожается по завершении.

Проблема здесь в том, что несколько устройств могут отправлять данные одновременно. Поскольку процесс включает в себя получение исключительных блокировок в разных точках во время выполнения, иногда одно задание будет переходить на другое, которое уже выполняется (оно отклоняется с помощью ORA-20000).

Я хотел бы как-то использовать механизм Oracle AQ (расширенные очереди) для решения этой проблемы. Я представляю очередь заданий, которые выполняются FIFO. Даже если внешнее устройство B отправляет данные, в то время как процесс в настоящее время обрабатывает данные с внешнего устройства A, очередь предотвращает обработку данных с устройства B до тех пор, пока обработка для устройства A не будет завершена.

Похоже, в документации Oracle нет отдельного раздела об этом типе обработки AQ, но, похоже, это будет довольно распространенный сценарий. Кто-нибудь еще решил этот тип проблемы с Oracle AQ?

0

1 ответ на вопрос

0
ibre5041

Вы можете реализовать это следующим образом: программа заданий планировщика реализована в виде бесконечного цикла - без сбоев. Этот цикл выводит сообщения из AQ и обрабатывает их. Задание планировщика отправляется только один раз - из системы событий даже запускается AFTER STARTUP ON DATABASE.

Он не использует ни цепочки планировщика, ни какие-либо другие расширенные опции планировщика. Просто задание планировщика запускается триггером, когда база данных начинает работать, задание «никогда не заканчивается» .

Но я думаю, что dbms_scheduler очень мощен в наше время, и есть способы, как ограничить параллельное выполнение для расписания.

PS: ORA-20000 - это определенный пользователем код ошибки. База данных никогда не возвращает такую ​​ошибку самостоятельно.

Можете ли вы привести пример (псевдокод или аналогичный) того, как это может работать с бесконечной запланированной работой, о которой вы упоминаете? Например, как будет настроен механизм AQ, и как вы предотвратите одновременное выполнение нескольких процессов? Будет ли это ограничение, определенное в работе или в механизме AQ? mlehmeher 8 лет назад 0

Похожие вопросы