分类: Oracle
2008-04-24 20:52:21
问题如下,一个每隔1个小时Run一次的job,如果某次job执行花费了2个小时,则下次job是在什么时候运行?是马上运行,还是等一个小时后再运行?
以前我想当然的一直以为是等待1个小时后再运行,就是Next_date按照job执行完毕后再计算。
事实是,Next_date是在job之前开始Run的时候计算,如果job延期结束,则job进程发现当前日期已经超过了Next_date,则会马上运行该job,并且以当前日期计算下次的Next_date.
SQL> create table bin_test(da date);
Table created. 建立表,包括一时间字段
SQL> create or replace procedure PBIN as
2 begin
3 insert into bin_test values(sysdate);
4 dbms_lock.sleep(600);
5 end;
6 /
Procedure created. sleep表示job至少10分钟
SQL> alter system set job_queue_processes=2;
System altered.
SQL> var a number
SQL> exec dbms_job.submit(:a,'begin PBIN; end;',sysdate,'sysdate+1/(24*12)');
PL/SQL procedure successfully completed.
表示每5分钟执行一次,而 procedure PBIN 至少花费10分钟
SQL> select job,what,this_date,next_date from dba_jobs;
JOB WHAT THIS_DATE NEXT_DATE
---------- ------------------------------ ------------------- -------------------
2 begin PBIN; end; 2006-08-05 03:15:07 2006-08-05 03:13:00
SQL> select * from v$Lock;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00000003B3810470 00000003B38105E8 31 TX 262173 1041 6 0 156 0
00000003B370D440 00000003B370D468 31 TM 7755 0 3 0 156 0
00000003AF9F97F8 00000003AF9F9818 31 JQ 0 2 6 0 157 0
13 rows selected.
SQL> select job,what,this_date,next_date,sysdate from dba_jobs;
JOB WHAT THIS_DATE NEXT_DATE SYSDATE
---------- ------------------------------ ------------------- ------------------- -------------------
2 begin PBIN; end; 2006-08-05 03;15:07 2006-08-05 03;13:00 2006-08-05 03;22:20
SQL> select job,what,this_date,next_date,sysdate from dba_jobs;
JOB WHAT THIS_DATE NEXT_DATE SYSDATE
---------- ------------------------------ ------------------- ------------------- -------------------
2 begin PBIN; end; 2006-08-05 03;25:23 2006-08-05 03;25:22 2006-08-05 03;26:38
SQL> select job,what,this_date,next_date,sysdate from dba_jobs;
JOB WHAT THIS_DATE NEXT_DATE SYSDATE
---------- ------------------------------ ------------------- ------------------- -------------------
2 begin PBIN; end; 2006-08-05 03;35:38 2006-08-05 03;35:37 2006-08-05 03;39:26
SQL> select * from bin_test;
DA
-------------------
2006-08-05 03;15:07
2006-08-05 03;25:23
2006-08-05 03;35:38
2006-08-05 03;45:54
表bin_test中每个纪录相差10分钟左右,表示作业一个刚停,一个又起。Next_date不会等到上个JOB结束再计算。