我正在使用Oracle Advanced队列将消息排入队列,然后使用PLSQL回调通知将其出列,我已在其中注册了一个过程。每当消息排队时,DBMS调度程序启动,消息出列并完成作业大约需要2分钟。如果在这两分钟内我重新编译了注册程序使用的子程序,那么DBMS调度程序将不会加载程序的新状态。问题是如果DBMS调度程序正在运行并且子程序包被重新编译并且在新消息入队时意味着出列进程将失败并显示“ORA-06508:PL / SQL:可能未找到程序单元被调用”异常并将移动消息到异常队列。由于调度程序现在必须执行一项任务,因此实例将需要更长时间才能完成,如果我们继续提交消息,那么调度程序将继续运行,并且所有消息都将以相同的异常失败。一旦调度程序的当前实例完成其作业,它将重新加载包的新状态,并且将正确处理将来的消息。
解决此问题的一种方法是,如果我在重新编译包之前将job_queue_processes设置为0,然后将其设置回初始值,但我不确定这是否是最佳方法 理想的解决方案是强制DBMS调度程序在修改后立即加载子实例的新实例,但我无法找到实现它的方法。
答案 0 :(得分:0)
如果您至少使用Oracle 11gR2(可能更早),您可以使用Edition-Based Redefinition
使您可以升级应用程序的数据库组件 它正在使用中,从而最大限度地减少或消除停机时间。
基于版本的重定义允许您同时定义和使用多个版本的模式对象(例如存储过程,函数和包),并从旧版本优雅地切换到新版本。