oracle AQ 用于计划作业

oracle AQ 用于计划作业

我们有一个进程,目前使用 Oracle DBMS_SCHEDULER 来执行。每次后端从外部设备接收数据时,该进程都会运行。Oracle 调度程序设置为在接收外部数据时创建一个作业,该作业立即执行,并在完成后自动销毁该作业。

这里的问题是多个设备可能同时发送数据。由于该过程涉及在整个执行过程中的不同点获取独占锁,因此偶尔一个作业会干扰另一个已在执行的作业(它会因 ORA-20000 而被拒绝)。

我想以某种方式使用 Oracle AQ(高级排队)机制来解决这个问题。我设想了一个按 FIFO 执行的作业队列。即使外部设备 B 在进程当前正在处理来自外部设备 A 的数据时发送数据,队列也会阻止处理来自设备 B 的数据,直到设备 A 的处理完成为止。

Oracle 文档中似乎没有关于此类 AQ 处理的特定部分,但这似乎是一种相当常见的情况。还有其他人用 Oracle AQ 解决过此类问题吗?

答案1

您可以这样实现它:调度程序作业程序实现为无限循环(永不失败)。此循环从 AQ 中提取消息并进行处理。调度程序作业仅提交一次 - 来自事件系统甚至触发器AFTER STARTUP ON DATABASE

它不使用任何调度程序链,也不使用任何其他高级调度程序选项。只需在数据库启动时触发器触发调度程序作业,该作业“永无休止”

但我认为 dbms_scheduler 现在非常强大,并且有办法限制计划的并行执行。

注:ORA-20000 是用户自定义错误代码,数据库本身不会返回此类错误。

相关内容