各位大神你们好,目前小弟碰到一个棘手的问题,由于要实现多个定时任务,我在Listener中配了多个Timer,即调用了Timer1.schedule(new TimerTask1(),...),Timer2.shchedule(new TimerTask2())...每个Timer间隔60S执行一次,现在出现问题如下:由于TimerTask中执行的任务数据量很大,效率很低,经常执行不出结果,但是如果在网页上执行相同任务,效率比较高。如:我在网页上点按钮执行任务(更新5万条数据),执行大概2分钟就可以完成,但是在Timer定时任务中,执行相同操作,会消耗很长很长时间,甚至得不出结果。跪求解决方法,如何提高定时任务的效率。
另外问个弱弱的问题:执行10万甚至更多数据,目的:如果数据库中存在记录,更新;如果不存在,插入;
需要执行这个任务:1.遍历10万条数据,判断数据库中是否存在,设置存在与否标记;之后重新遍历数据,
switch(存在标记),执行对应插入还是更新操作。
2.遍历10万条数据,判断数据库中是否存在(调用函数),存在执行doUpdate()方法,不存在执行doInsert()方法
两种方法是否第二种更优?谢谢
求大神们指导
另外问个弱弱的问题:执行10万甚至更多数据,目的:如果数据库中存在记录,更新;如果不存在,插入;
需要执行这个任务:1.遍历10万条数据,判断数据库中是否存在,设置存在与否标记;之后重新遍历数据,
switch(存在标记),执行对应插入还是更新操作。
2.遍历10万条数据,判断数据库中是否存在(调用函数),存在执行doUpdate()方法,不存在执行doInsert()方法
两种方法是否第二种更优?谢谢
求大神们指导
解决方案 »
- 遨游空白页小问题
- (求助) StandardHost[localhost]: MAPPING configuration error for request URI /webmodule1/jsp1.jsp 送50分
- 如何加密
- httpsessionListener
- 给一些有关文件操作的语句加说明.[觉得好贴UP一下]
- 请教:jsp:setProperty
- Tomcat4.1下的虚拟目录设置搞不定!!!
- jsp中怎么知道当前的数据库操作是否成功?
- 请教一下:关于JSP+ORACLE的问题,在WINDOWS2000下如何配置JDBC
- html+servlet在HTML文件中要怎样设置?在JB5中怎样调试?谢谢
- 有人见过这么诡异的Servlet配置么?
- spring3 mvc 报业务异常和处理异常后应答中文乱码
这个一定不是Timer自己的问题,Timer只是个调度者,执行效率只能是程序自己的问题。建议给你的TimerTaskN增加一些日志,用来进行性能(执行时间)的审计,比如记录启动和执行完SQL的时间,便于发现问题。另外,如果是N个线程并发SQL同时操作一张表,这个很可能会在数据库层面排队执行的。
【关于数据库】
执行插入或更新,这个实在是个很浪费时间的东西。
方案一是没啥价值的,轮询两边数据库,性能不会有提升的;更何况你这个“存在标记”还未必合适建索引,因为修改字段时同步更新索引也是有开销的。
方案二是常规做法,但是每次操作变成要先查询一次,再更新或插入一次。不知道你这些待更新或插入的数据,是数据库中另一张表已有,还是全都是程序提供的。
如果是程序提供的话,考虑可以逐条执行Update,对于Update执行失败的(更新数为0)也即说明没有该记录,那么再执行insert;这种方式下,如果每批10W条中实际更新数量更多时,则性能较好;如果每批10W条中实际更新数量很少,则性能退化为你的方案二。
有点理解不能不知道你的“等很久”是因为所设置的Timer启动时间很长还是啥意思?如果只是启动时间很长的话,调试阶段就设置断点好了,比如5秒间隔就跑一轮。
将更新或插入的判断交给数据库的存储过程去完成,有的数据库支持merge语句(如oracle9i),则可直接完成有则更新无则插入的过程,这样就可以减少程序与数据库的交互次数,并且提高性能。
刚做过调试,如果页面请求操作,10W条数据在执行Update操作只要花费1分钟,但是Timer定时器同样执行10W条Update更新操作,要花费20分钟,真的不知道哪问题了两种形式Update操作调用的是同一个方法
感觉是不是你的方法被调度重复调用了几次?引用楼主:1、每个Timer间隔60S执行一次2、做过调试,如果页面请求操作,10W条数据在执行Update操作只要花费1分钟,
有可能是1分钟还没跑完 第二个Timer就跑起来 弄成队列等待了、 试试换间隔大些、
insert 语句 批量的话 大数据插入最好是使用jdbc batch 设置手动提交事务、每多少10000条或者5000条提交一次、数据库也是一方面
我反问下楼主,如果你的定时任务在60s内没有完成呢?这就会导致很多积压的schedule,所有导致你的系统异常缓慢,我们一般的解决办法是,就是在做定时任务的时候,加入Callback方法,
这样就可以知道任务的完成情况。然后根据情况决定是否要继续下一次的任务。
那如果这样的话,和第二个方案比起来,效率怎么样啊?请教请教【大哥】