问题描述
有没有办法限制可以同时运行的 IMMEDIATE/ONCE 类型作业的数量。
场景:参数 job_queue_processes 设置为 10。
配置了一个循环作业(名称:TEST_JOB),每 1 秒间隔运行一次,并执行关键的应用程序处理任务。
应用程序还有一些可以根据请求执行的批处理,这些批处理还使用 DBMS_SCHEDULER 作业来加快处理速度。这些作业由具有 AUTO_DROP=TRUE 配置的批处理自动创建,并且只执行一次。批量创建的作业数量可以在 50 到 100 之间,这些作业是在 DEFAULT_CLASS 下创建的。
问题是,当一个批处理被执行时,由于整个job_queue_processes槽/作业被批处理提交的作业消耗(因为提交的作业数量高于job_queue_processes值),重要的重复TEST_JOB必须等待运行完成工作。
有什么方法可以将 DBMS_SCHEDULER 配置为仅使用 9 个(10 个中的)槽/作业进行一次执行作业,并保持 1 个槽/作业始终可用于重复的 TEST_JOB。
感谢您的帮助。
解决方法
我不知道有什么方法可以预订这样的工作流程。也就是说,您有几个选择:
让关键工作始终运行
不是在关键任务完成时结束作业,而是循环以再次运行它:
begin
loop important_task; end loop;
end;
这意味着作业永远不会停止,因此没有其他进程可以消耗所有可用的作业槽。
我会添加某种选项来跳出循环(例如,检查表中的一行,如果它已停止则退出),以便您可以禁用它以进行升级等,并且您可能需要在此之间短暂睡眠运行,但原理不变。
优先处理关键工作
调度器具有强大的job prioritization capabilities;您可以使用它来通过限制其他批处理作业的可用资源来确保关键作业能够执行。