2010-09-16 63 views
-1

我已经为每秒运行的ORACLE DB 编写了此计划作业。减少预定作业的时间

现在在我的日程安排程序中,我想要做的是将 设置为每5毫秒的频率。

BEGIN  
    sys.dbms_scheduler.create_schedule( 
      repeat_interval =>'FREQ=SECONDLY;INTERVAL=1', 
      start_date => to_date('15:19 09/16/10','HH24:MI MM/DD/YY'), 
      comments => 'Schedule for periodic loads', 
      schedule_name => 'UserName.DOLOADS'); 
END; 

等待您的宝贵建议..

回答

2

“的第二个位置,第二那里,很快你说的实时性。”

你能详细解释一下你想达到的目标吗?从您的问题来看,您是不是只想每5毫秒执行一次计划作业,或者是否希望计划作业本身将其频率从1秒更改为5毫秒,这一点还不清楚。

我不知道是否可以指定5ms的频率,这听起来像你真的不应该做的事情。

也许调查一个替代机制?在一种需要近乎即时工作执行的情况下,我使用高级队列来快速响应事件,并与主逻辑流程并行进行响应。

+0

+1因为如果你需要每秒运行一个工作,你肯定需要一些排队的东西,而不是每秒运行的工作。 – ZeissS 2010-09-16 15:14:19

2

您无法安排DBMS_SCHEDULER(或DBMS_JOB)作业每5毫秒运行一次。即使您计划每秒运行一次,这也只是一个近似值 - 如果在连续运行之间有2或3秒时间,这仅仅是因为作业有资格运行和作业调度程序之间的正常延迟实际上拿起它并开始运行它。

为什么要将您的评论描述为“周期性负载”的工作每5毫秒运行一次?你能描述一下数据流吗?如果您正在寻找接近实时数据复制的东西,几乎可以找到更好的方法来解决这个问题。

所有这一切是说,如果你真的非常迅速地查询,你大概可以得到最接近的是编写运行一个无限循环,它的10毫秒(0.01秒)DBMS_LOCK.SLEEP工作。这将引进时,你必须做保养或关闭数据库,并有杀死当前运行的进程等的额外的复杂性的各种但如果schema_name.DoLoads被改写像做

CREATE PROCEDURE NewDoLoads 
AS  
BEGIN 
    WHILE(true) 
    LOOP 
    schema_name.DoLoads; 
    dbms_lock.sleep(0.01); 
    END LOOP; 
END NewDoLoads; 

那会每0.01秒(10毫秒)执行当前的DoLoads进程。这是dbms_lock可以处理的最小增量。

+1

+1不断运转的工作绝对比每隔几毫秒开始一项工作要好。 – APC 2010-09-16 15:34:47