Java使用Timer定时器效率低下,执行上万数据

gtkdan 2012-11-06 09:02:23
各位大神你们好,目前小弟碰到一个棘手的问题,由于要实现多个定时任务,我在Listener中配了多个Timer,即调用了Timer1.schedule(new TimerTask1(),...),Timer2.shchedule(new TimerTask2())...每个Timer间隔60S执行一次,现在出现问题如下:由于TimerTask中执行的任务数据量很大,效率很低,经常执行不出结果,但是如果在网页上执行相同任务,效率比较高。如:我在网页上点按钮执行任务(更新5万条数据),执行大概2分钟就可以完成,但是在Timer定时任务中,执行相同操作,会消耗很长很长时间,甚至得不出结果。跪求解决方法,如何提高定时任务的效率。
另外问个弱弱的问题:执行10万甚至更多数据,目的:如果数据库中存在记录,更新;如果不存在,插入;
需要执行这个任务:1.遍历10万条数据,判断数据库中是否存在,设置存在与否标记;之后重新遍历数据,
switch(存在标记),执行对应插入还是更新操作。
2.遍历10万条数据,判断数据库中是否存在(调用函数),存在执行doUpdate()方法,不存在执行doInsert()方法
两种方法是否第二种更优?谢谢
求大神们指导
...全文
1154 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
瑞哥 2013-01-11
  • 打赏
  • 举报
回复
哪有那么多执行不完回滚呀,每回都执行不完,那你还每回都回滚哪,那程序跑的有啥意义
瑞哥 2013-01-11
  • 打赏
  • 举报
回复
你run的时候打印一下执行成功的记录,看你究竟执行插入了多少条,另外你要用定时器去跑流程,尤其是间隔时间短,那你应该弄个中间表或记日志的做个开关,run进去标记一个状态,10万条完了再改这个状态,如果第二次跑时第一回没执行完,或布在别的机器上的timer正在用这个开关,那你就跳过,等待下次执行
Jacky-止涯 2012-11-09
  • 打赏
  • 举报
回复
引用 楼主 gtkdan 的回复:
1.遍历10万条数据,判断数据库中是否存在,设置存在与否标记;之后重新遍历数据, switch(存在标记),执行对应插入还是更新操作。
引用 1 楼 ldh911 的回复:
【关于数据库】 方案一是没啥价值的,轮询两边数据库,性能不会有提升的;更何况你这个“存在标记”还未必合适建索引,因为修改字段时同步更新索引也是有开销的。
楼主的第一个方案是不是说,标记好后,就可以拼装sql然后批量去执行。 那如果这样的话,和第二个方案比起来,效率怎么样啊?请教请教【大哥】
ben_2_ben 2012-11-08
  • 打赏
  • 举报
回复
引用 8 楼 zqfddqr 的回复:
是不是timer的线程优先级不行 jsp容器把页面的优先级调高了啊 http://wenku.baidu.com/view/97aaa9befd0a79563c1e726b.html
TIMER应该是新开一个线程吧。
Giberson1 2012-11-08
  • 打赏
  • 举报
回复
你这里有一个问题,就是你每60s执行一次定时任务, 我反问下楼主,如果你的定时任务在60s内没有完成呢? 这就会导致很多积压的schedule,所有导致你的系统异常缓慢, 我们一般的解决办法是,就是在做定时任务的时候,加入Callback方法, 这样就可以知道任务的完成情况。然后根据情况决定是否要继续下一次的任务。
ydj7501603 2012-11-08
  • 打赏
  • 举报
回复
你可以试试spring的定时器。如果用到spring的话。
gtkdan 2012-11-08
  • 打赏
  • 举报
回复
引用 10 楼 sd4000784 的回复:
引用 7 楼 gtkdan 的回复:引用 5 楼 ldh911 的回复:引用 2 楼 gtkdan 的回复:大哥说的很有道理,数据库操作优化操作很好,还有个问题,网页请求的操作是否要比Timer自动运行的效率高一点,因为在调试Timer定时任务时候,要等很久,页面请求很快的。 有点理解不能。。。 不知道你的“等很久”是因为所设置的Timer启动时间很长还是啥意……
刚测试了一下,调到足够大间隔,问题还是存在o(╯□╰)o
  • 打赏
  • 举报
回复
insert 语句 批量的话 大数据插入最好是使用jdbc batch 设置手动提交事务、 每多少10000条或者5000条提交一次、 数据库也是一方面
  • 打赏
  • 举报
回复
引用 7 楼 gtkdan 的回复:
引用 5 楼 ldh911 的回复:引用 2 楼 gtkdan 的回复:大哥说的很有道理,数据库操作优化操作很好,还有个问题,网页请求的操作是否要比Timer自动运行的效率高一点,因为在调试Timer定时任务时候,要等很久,页面请求很快的。 有点理解不能。。。 不知道你的“等很久”是因为所设置的Timer启动时间很长还是啥意思?如果只是启动时间很长的话,调试阶……
感觉是不是你的方法被调度重复调用了几次? 引用楼主: 1、每个Timer间隔60S执行一次 2、做过调试,如果页面请求操作,10W条数据在执行Update操作只要花费1分钟, 有可能是1分钟还没跑完 第二个Timer就跑起来 弄成队列等待了、 试试换间隔大些、
gtkdan 2012-11-08
  • 打赏
  • 举报
回复
引用 6 楼 new_bird_0001 的回复:
【关于数据库】 将更新或插入的判断交给数据库的存储过程去完成,有的数据库支持merge语句(如oracle9i),则可直接完成有则更新无则插入的过程,这样就可以减少程序与数据库的交互次数,并且提高性能。
学习了,不过目前我的数据来源是存储在内存list中,貌似不能使用Merge语句
zqfddqr 2012-11-08
  • 打赏
  • 举报
回复
是不是timer的线程优先级不行 jsp容器把页面的优先级调高了啊 http://wenku.baidu.com/view/97aaa9befd0a79563c1e726b.html
gtkdan 2012-11-08
  • 打赏
  • 举报
回复
引用 5 楼 ldh911 的回复:
引用 2 楼 gtkdan 的回复:大哥说的很有道理,数据库操作优化操作很好,还有个问题,网页请求的操作是否要比Timer自动运行的效率高一点,因为在调试Timer定时任务时候,要等很久,页面请求很快的。 有点理解不能。。。 不知道你的“等很久”是因为所设置的Timer启动时间很长还是啥意思?如果只是启动时间很长的话,调试阶段就设置断点好了,比如5秒间隔就跑一……
刚做过调试,如果页面请求操作,10W条数据在执行Update操作只要花费1分钟,但是Timer定时器同样执行10W条Update更新操作,要花费20分钟,真的不知道哪问题了。。。两种形式Update操作调用的是同一个方法
gtkdan 2012-11-07
  • 打赏
  • 举报
回复
大哥说的很有道理,数据库操作优化操作很好,还有个问题,网页请求的操作是否要比Timer自动运行的效率高一点,因为在调试Timer定时任务时候,要等很久,页面请求很快的。
new_bird_0001 2012-11-07
  • 打赏
  • 举报
回复
【关于数据库】 将更新或插入的判断交给数据库的存储过程去完成,有的数据库支持merge语句(如oracle9i),则可直接完成有则更新无则插入的过程,这样就可以减少程序与数据库的交互次数,并且提高性能。
MiceRice 2012-11-07
  • 打赏
  • 举报
回复
引用 2 楼 gtkdan 的回复:
大哥说的很有道理,数据库操作优化操作很好,还有个问题,网页请求的操作是否要比Timer自动运行的效率高一点,因为在调试Timer定时任务时候,要等很久,页面请求很快的。
有点理解不能。。。 不知道你的“等很久”是因为所设置的Timer启动时间很长还是啥意思?如果只是启动时间很长的话,调试阶段就设置断点好了,比如5秒间隔就跑一轮。
  • 打赏
  • 举报
回复
纯SQL 问题。
ben_2_ben 2012-11-07
  • 打赏
  • 举报
回复
调试的时候还用顾忌性能?
MiceRice 2012-11-07
  • 打赏
  • 举报
回复 1
【关于Timer】 这个一定不是Timer自己的问题,Timer只是个调度者,执行效率只能是程序自己的问题。 建议给你的TimerTaskN增加一些日志,用来进行性能(执行时间)的审计,比如记录启动和执行完SQL的时间,便于发现问题。 另外,如果是N个线程并发SQL同时操作一张表,这个很可能会在数据库层面排队执行的。 【关于数据库】 执行插入或更新,这个实在是个很浪费时间的东西。 方案一是没啥价值的,轮询两边数据库,性能不会有提升的;更何况你这个“存在标记”还未必合适建索引,因为修改字段时同步更新索引也是有开销的。 方案二是常规做法,但是每次操作变成要先查询一次,再更新或插入一次。 不知道你这些待更新或插入的数据,是数据库中另一张表已有,还是全都是程序提供的。 如果是程序提供的话,考虑可以逐条执行Update,对于Update执行失败的(更新数为0)也即说明没有该记录,那么再执行insert;这种方式下,如果每批10W条中实际更新数量更多时,则性能较好;如果每批10W条中实际更新数量很少,则性能退化为你的方案二。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧