Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103739151
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-24 20:52:21

发表人:dbaoracle

问题如下,一个每隔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结束再计算。

阅读(382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~