Oracle Job调度优先级排队规则(oracle job排队)
Oracle Job调度:优先级排队规则
在企业级应用中,我们时常需要完成定时任务调度的功能,Oracle Job是一种常见的任务调度方式,可以通过它实现周期性的批处理任务,例如报表生成、数据清理等。然而,在任务并发较高的场景下,如何保证任务顺利运行和优化资源利用,就需要借助于Oracle Job的优先级排队规则。
在Oracle数据库中,创建Job的基本语法为:
DBMS_JOB.SUBMIT(
job OUT BINARY_INTEGER, -- 任务ID what IN VARCHAR2, -- 任务要做的操作
next_date IN DATE DEFAULT SYSDATE, -- 任务开始时间 interval IN VARCHAR2 DEFAULT 'null', -- 任务执行周期
no_parse IN BOOLEAN DEFAULT FALSE, -- 禁止语法校验标志 instance IN BINARY_INTEGER DEFAULT ANY_INSTANCE,
force IN BOOLEAN DEFAULT FALSE); -- 是否将任务置为FORCED状态
其中,最重要的是interval参数,它决定了Job的执行频率和时间间隔,可以采用以下方式指定:
* 使用数字:例如’30’代表每30秒执行一次;
* 使用字符串:例如’TRUNC(SYSDATE+15/1440)+15/1440’,代表每15分钟执行一次。
在我们使用协调定时(Job Scheduler)服务时,通常会遇到如下两种场景:
* 不同的任务有不同的执行频率,有些任务需要较高的优先级以确保及时执行;
* 同时启动的多个任务可能会暂时竞争执行资源,需要合理地规划任务队列,以确保高优先级任务不受影响。
基于这些需求,我们可以使用一些高级技术,比如Oracle Job优先级和规则控制来调整任务执行顺序。针对上述场景,我们可以设计如下优先级制度:
1. 所有默认的Job都以20的优先级排成队列;
2. 当有多个任务同时提交时,最高优先级的任务会被取出执行,同时其他任务被排入20的队列等待下一次运行;
3. 对于高优先级的任务,我们设置较小的间隔,并确保他们及时执行;
4. 对于低优先级的任务,我们设置较大的间隔,并适当考虑任务的复杂度和资源占用情况。
针对以上的任务优先级和任务控制方案,我们可以使用如下的存储过程实现:
CREATE OR REPLACE PROCEDURE submit_job (
job_what IN VARCHAR2, job_when IN VARCHAR2,
job_priority IN NUMBER DEFAULT 20) IS
l_jobno number; BEGIN
DBMS_JOB.SUBMIT ( job => l_jobno,
what => job_what, next_date => job_when,
interval => null, no_parse => false,
instance => null );
IF job_priority != 20 THEN DBMS_JOB.CHANGE_PRIORITY (
job => l_jobno, priority => job_priority
); END IF;
COMMIT; EXCEPTION
WHEN OTHERS THEN RSE;
END;
使用如下代码测试我们刚刚编写的Job规则:
BEGIN
submit_job ('dbms_stats.gather_schema_stats(''SCOTT'',CASCADE=>TRUE)', 'SYSDATE-1/24', 30); submit_job ('dbms_stats.gather_table_stats(''SCOTT'',''EMP'',CASCADE=>TRUE)', 'SYSDATE+1/24', 20);
submit_job ('dbms_stats.gather_index_stats(''SCOTT'',''EMP_PK'')', 'SYSDATE+1/24*2', 20); submit_job ('dbms_stats.gather_index_stats(''SCOTT'',''EMP_IDX'')', 'SYSDATE+1/24*3', 20);
END;
通过使用以上代码,我们可以实现定时任务的优先级排队规则,确保任务在高并发场景下执行的顺畅和准确性。在日常开发过程中,我们还需要注意一些问题,如尽可能避免在数据库中提交长时间运行的任务,以及使用TO_DATE函数确保Job的精确时间安排。