【问题标题】:reducing the time of scheduled job减少预定工作的时间
【发布时间】:2010-09-16 13:51:35
【问题描述】:

我已经为 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;

等待您的宝贵建议..

【问题讨论】:

    标签: oracle oracle10g jobs scheduling


    【解决方案1】:

    “这里一秒钟,那里一秒钟,很快你就开始说实时了。”

    您能否更详细地解释一下您要达到的目标?从您的问题中不清楚您是否只想让计划作业每 5 毫秒运行一次,或者您是否希望计划作业本身将其频率从 1 秒更改为 5 毫秒。

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

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

    【讨论】:

    • +1 因为如果你需要每秒运行一个作业,你肯定需要一些排队的东西,而不是每秒运行的作业。
    【解决方案2】:

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

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

    话虽如此,如果您真的想要非常快速地轮询,那么您最接近的可能是编写一个运行无限循环的作业,该作业执行 10 毫秒的 dbms_lock.sleep ( 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 毫秒)运行当前的 DoLoads 进程。这是 dbms_lock 可以处理的最小增量。

    【讨论】:

    • +1 持续运行的作业绝对比每隔几毫秒尝试开始作业要好。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多