Планировщик СУБД не загружает новое состояние пакета в режиме реального времени
Я использую очереди Oracle Advanced для постановки в очередь сообщений, а затем удаления их из очереди с помощью уведомления обратного вызова PLSQL, в котором я зарегистрировал процедуру. Всякий раз, когда сообщение ставится в очередь, запускается планировщик СУБД, и требуется около 2 минут для удаления сообщения из очереди и завершения работы. Если в течение этих двух минут я перекомпилирую дочернюю процедуру, которую использует процедура регистрации, то планировщик СУБД не загрузит новое состояние процедуры. Проблема заключается в том, что если планировщик СУБД запущен, а дочерний пакет перекомпилирован и означает, что, когда новое сообщение ставится в очередь, тогда процесс удаления завершится с ошибкой "ORA-06508: PL/SQL: НЕ МОЖЕТ НАЙТИ ПРОГРАММНЫЙ БЛОК ВЫЗЫВАЕТСЯ" и переместится сообщение в очередь исключений. Поскольку планировщику теперь нужно было выполнить еще одну задачу, то завершение экземпляра займет больше времени, и если мы будем продолжать отправлять сообщения, то планировщик продолжит работать, и все сообщения не будут выполнены с тем же исключением. Как только текущий экземпляр планировщика завершит свою работу, он перезагрузит новое состояние пакета, и будущее сообщение будет обработано правильно.
Один из способов исправить это - установить для job_queue_processes значение 0, прежде чем перекомпилировать пакет, а затем вернуть его к исходному значению, но я не уверен, что это лучший подход. Идеальным решением будет заставить планировщик СУБД загрузить новый экземпляр дочерней процедуры, как только они будут изменены, но я не могу найти способ сделать это.
1 ответ
Если вы используете хотя бы Oracle 11gR2 (возможно, ранее), вы можете использовать переопределение на основе редакции, которое
позволяет обновлять компонент базы данных приложения во время его использования, минимизируя или устраняя время простоя.
Переопределение на основе редакции позволяет вам определять и использовать одновременно несколько версий объектов схемы (таких как хранимые процедуры, функции и пакеты), а также плавно переключаться со старой версии на новую.