我现在有一个job需要每10分钟执行一次作业,
我是用游标对数据进行循环处理的,因为数据在处理的时候还在不断增加,等这批数据处理完毕,可能需要2,3个小时,这样,在本次作业刚开始执行的时候才加进来的数据,就需要等2,3个小时,也就是这次作业完毕后,才会被处理,这样就造成很大的延迟,不知道有没有什么办法,就算job这次还没有执行完毕,只要下个10分钟到了,就另启动一个线程进行作业。高手请指教,解决问题开贴另加100
我是用游标对数据进行循环处理的,因为数据在处理的时候还在不断增加,等这批数据处理完毕,可能需要2,3个小时,这样,在本次作业刚开始执行的时候才加进来的数据,就需要等2,3个小时,也就是这次作业完毕后,才会被处理,这样就造成很大的延迟,不知道有没有什么办法,就算job这次还没有执行完毕,只要下个10分钟到了,就另启动一个线程进行作业。高手请指教,解决问题开贴另加100
一般我们就写死这个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执行而不管上次执行到底是几点
一般来说Iterval应该大于运行时间.
没实验过,如果楼主试过可以,请贴点结果上来.
做了实验再问比等好.(至少我现在认为不可行,对一个job是串行化的,而不是并行的)
我们有个项目也是类似:
把一批数据当做一个batch来处理.(进入队列)
后来的数据进入下一个batch(再进入队列).
下面以此类推.
只有一个batch完成才启动下一个batch,以此来达到执行的串行化.
在每天00:00:00用JOB执行一个存储过程,但是到第二天一看执行时间改为了
00:00:05,也不知道怎么回事,对取数据应该是有5秒中的数据没有取到,
请问有什么解决方法?
通过前台实现:
做一个队列(Queue)表,每次定时触发时,锁定线程,从Queue中取出数据更新到另一表中。
但是,如果数据量太大,间隔时间又特小(比如1秒,100毫秒),系统提示:线程池不够,这是.net的Timer的问题,就是说CPU处理数据库的过程比间隔时间还小,系统当然会出错。
一般采用阻塞线程的方法,道理和设置较长的间隔时间是一样的你的问题:
从数据库解决的话,作个Queue标表(先进先出),把定时取得的数据都存放到Queue中,然后
定时把Queue的数据更新到真正的表中