我现在有一个job需要每10分钟执行一次作业,
我是用游标对数据进行循环处理的,因为数据在处理的时候还在不断增加,等这批数据处理完毕,可能需要2,3个小时,这样,在本次作业刚开始执行的时候才加进来的数据,就需要等2,3个小时,也就是这次作业完毕后,才会被处理,这样就造成很大的延迟,不知道有没有什么办法,就算job这次还没有执行完毕,只要下个10分钟到了,就另启动一个线程进行作业。高手请指教,解决问题开贴另加100

解决方案 »

  1.   

    JOB的下一次运行时间是会受上一次影响的,在运行结束之后才会更新next_date,但是计算的方法是JOB刚开始的时间加上interval设定的间隔,
    一般我们就写死这个interval(Trunc())
    SQL> variable jobno number;
    SQL> BEGIN
    2 DBMS_JOB.SUBMIT(job => :jobno,
    3 what => 'sp_next_date;',
    4 next_date => SYSDATE,
    5 interval => 'trunc(SYSDATE)+3/24+1');
    6 COMMIT;
    7 END;
    8 /
    我们要JOB在每天的凌晨3:00执行而不管上次执行到底是几点
      

  2.   

    你的这个逻辑好象也没对啊,整个运行周期要2,3个小时,而Iterval才10分钟.
    一般来说Iterval应该大于运行时间.
    没实验过,如果楼主试过可以,请贴点结果上来.
      

  3.   

    正因为不可以我才问的嘛,我的job不是每次都2,3小时执行时间,通常情况下,1分钟不到吧
      

  4.   

    那你就用个长的执行时间(超过10分钟)来做个实验,短于10分钟的按照我上面说的应该不会发生时间推迟.
    做了实验再问比等好.(至少我现在认为不可行,对一个job是串行化的,而不是并行的)
      

  5.   

    时间短的,当然是没有问题,我现在的问题就是时间超长,有没有办法让job并行
      

  6.   

    我指在前台用队列来控制后台存储过程的执行,要不开线程来达到并行,但可能会有锁问题(很麻烦).
    我们有个项目也是类似:
    把一批数据当做一个batch来处理.(进入队列)
    后来的数据进入下一个batch(再进入队列).
    下面以此类推.
    只有一个batch完成才启动下一个batch,以此来达到执行的串行化.
      

  7.   

    我也是有相同的问题:
    在每天00:00:00用JOB执行一个存储过程,但是到第二天一看执行时间改为了
    00:00:05,也不知道怎么回事,对取数据应该是有5秒中的数据没有取到,
    请问有什么解决方法?
      

  8.   

    我刚做了一个.net的项目,就是间隔时间小于完成任务的时间。
    通过前台实现:
    做一个队列(Queue)表,每次定时触发时,锁定线程,从Queue中取出数据更新到另一表中。
    但是,如果数据量太大,间隔时间又特小(比如1秒,100毫秒),系统提示:线程池不够,这是.net的Timer的问题,就是说CPU处理数据库的过程比间隔时间还小,系统当然会出错。
    一般采用阻塞线程的方法,道理和设置较长的间隔时间是一样的你的问题:
    从数据库解决的话,作个Queue标表(先进先出),把定时取得的数据都存放到Queue中,然后
    定时把Queue的数据更新到真正的表中
      

  9.   

    首先,是想办法提高你的JOB的执行效率,如果硬要并行执行JOB,我觉得这样不合适,因为你的JOB执行时间远大于间隔,这样的话很有可能造成执行JOB的线程越堆越多,效率越来越慢,数据库很可能会当机