定时器从数据库拿数据问题

hello_realWorld 2017-09-26 12:11:36
现在有个五分钟走一次的定时器,每次都会跑一个线程从数据库拿五千条数据,,,但是发现如果上个定时器的线程没有处理完数据,下个线程会拿到和上个线程重复的数据,,造成两个线程,跑的都是重复的数据,,,怎么解决这种情况呢感谢!!!
...全文
1046 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
摩西云 2017-10-27
  • 打赏
  • 举报
回复
在数据库里面做一个最后数据处理的标志,处理完一次标志更新一次,这样就不会重复处理了
dong_19890208 2017-10-27
  • 打赏
  • 举报
回复
可以根据当前时间点查询数据的时候按照时间过滤,这样每次起的线程里处理的数据就不重复了
coolroy2000 2017-10-27
  • 打赏
  • 举报
回复
需要增加数据的处理状态(开始处理,处理完成等)
hwn0412 2017-10-26
  • 打赏
  • 举报
回复
设置线程名,每次执行前根据线程名是否存在,如果存在则不执行。
sdfgrtyu 2017-10-18
  • 打赏
  • 举报
回复
你用的是什么定时器
海_贼-王 2017-10-18
  • 打赏
  • 举报
回复
2个方案: 1、弄一个标志参数boolean-A,加锁 。 每次一个定时器开启,去执行前访问该参数 ,如果A为false,就执行 ,并改标志位为true ; 否则不执行 2、不要使用apache定时器, 改为使用java.util.timer类进行定时执行 。第一次执行完后 ,设置5分钟后执行第二次 ! 依次执行下去就好!
  • 打赏
  • 举报
回复
增加一个标志位的数据字段 status ( 0 : 正常 1:正在处理 2:已处理) 伪代码: 开始事务--- 取数据 select .... update set status = 1 where status =0 and (5000条的范围) ... 结束事务---
weixin_40671910 2017-10-17
  • 打赏
  • 举报
回复
1. 数据库表增加一个marker列 2. 取数据前,update 表 set marker = 'XXXXX' where marker is null, 3. select * from 表 where marker = ''XXXXX' 保证定时任务每次运行的marker都不一样就好
id_1314520 2017-10-15
  • 打赏
  • 举报
回复
5分钟时间到了,你就断掉当前线程与数据库的连接,进去下一个线程就好了
捡到一枚菊花 2017-10-13
  • 打赏
  • 举报
回复
那你在拿到数据的时候先做个查询,发现已经处理的跳过去,没处理的就继续处理
hello_realWorld 2017-09-26
  • 打赏
  • 举报
回复
hello_realWorld 2017-09-26
  • 打赏
  • 举报
回复
hello_realWorld 2017-09-26
  • 打赏
  • 举报
回复
hello_realWorld 2017-09-26
  • 打赏
  • 举报
回复
引用 4 楼 clark_kidd 的回复:
你能不能告诉我“上个定时器的线程没有处理完数据”,为什么处理5000条数据要跑个5分钟呢?
本地的话,处理数据5000条数据一会就结束了。但是部署到linux上,就慢了,循环里面每条数据都要发送一个请求,都会在发送请求这卡一下,所以会很慢
clark_kidd 2017-09-26
  • 打赏
  • 举报
回复
你能不能告诉我“上个定时器的线程没有处理完数据”,为什么处理5000条数据要跑个5分钟呢?
clark_kidd 2017-09-26
  • 打赏
  • 举报
回复
如果发送请求会阻塞的话,是不是可以考虑做个队列,委托给线程处理,释放掉数据库连接呢? 或者考虑脏数据处理select ... with(nolock)

25,985

社区成员

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

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