首页 文章

DBMS调度程序不实时加载包的新状态

提问于
浏览
0

我正在使用Oracle Advanced队列将消息排入队列,然后使用PLSQL回调通知将其出列,我已在其中注册了一个过程 . 每当消息排队时,DBMS调度程序启动,消息出列并完成作业大约需要2分钟 . 如果在这两分钟内我重新编译了注册程序使用的子程序,那么DBMS调度程序将不会加载程序的新状态 . 问题是如果DBMS调度程序正在运行并且子程序包被重新编译并且在新消息入队时意味着出列进程将失败并显示“ORA-06508:PL / SQL:可能未找到程序单元被调用”异常并将移动消息到异常队列 . 由于调度程序现在必须执行一项任务,因此实例将需要更长时间才能完成,如果我们继续提交消息,那么调度程序将继续运行,并且所有消息都将以相同的异常失败 . 一旦调度程序的当前实例完成其作业,它将重新加载包的新状态,并且将正确处理将来的消息 .

解决这个问题的一种方法是,如果我在重新编译包之前将job_queue_processes设置为0,然后将其设置回初始值,但我不确定这是否是最佳方法理想的解决方案是强制DBMS调度程序加载子程序的新实例一旦被修改但我无法找到方法 .

1 回答

  • 0

    如果您至少使用Oracle 11gR2(可能更早),您可以使用Edition-Based Redefinition

    使您可以在应用程序正在使用时升级该数据库组件,从而最大限度地减少或消除停机时间 .

    基于版本的重定义允许您同时定义和使用多个版本的模式对象(例如存储过程,函数和包),并从旧版本优雅地切换到新版本 .

相关问题