繁体   English   中英

减少安排工作的时间

[英]reducing the time of scheduled job

我已经为每秒运行的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;

等待您的宝贵建议。

“一秒钟在那儿,一秒钟在那儿,很快你就在谈论实时。”

您能否更详细地说明您要达到的目标? 从您的问题尚不清楚,您是否只想让调度的作业每5毫秒运行一次,还是要调度的作业本身将其频率从1秒更改为5毫秒。

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

也许研究替代机制? 在需要几乎即时执行作业的情况下,我使用高级队列来快速响应事件,并且与主要逻辑流程并行。

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

为什么要让您的注释描述为“定期负载”的作业每5毫秒运行一次? 您能否描述一下数据流? 如果您正在寻找近乎实时的数据复制之类的东西,几乎肯定会有更好的方法来解决该问题。

话虽如此,如果您真的想非常快速地轮询,那么可能可以得到的最接近的方法是编写一个运行无限循环的作业,该循环执行dbms_lock.sleep为10毫秒(0.01秒)。 当您必须进行维护或关闭数据库并必须终止当前正在运行的进程等时,这将带来各种其他复杂性。但是如果将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毫秒)执行一次当前DoDos加载过程。 这是dbms_lock可以处理的最小增量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM