java - 在多线程处理表数据的时候 ,怎么防止数据被重复处理?
迷茫
迷茫 2017-04-17 12:00:13
[Java讨论组]

悲剧啊,,,
侦听卡死了,数据积存了13天,上千万数据。
现有程序处理不过来,需要写一个多线程来处理。


如题,该如何加锁?希望各位前辈能给一点建议。

顺便说一下,需要处理的表有一个状态字段,用于标识处理与否。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
伊谢尔伦

其实这个不是加锁的问题,而是数据分发的问题。加锁是为了防止高并发下产生脏数据,而你其实是希望处理过或者已被其他线程先拿到的数据不要再处理了,对吧?

如何进行数据分发,提高集群(或多线程)处理效率,这个要结合你们的数据模型来考虑。

比如处理的数据ID中有数字标识,当前你有10台机器或者10个线程,那么可以让这10台机器各自读取1/10的数据,这可以通过取余(%10)做到。比如第1台机器读取i%10==1的ID的数据,第2台读取i%10==2的,以此类推。

黄舟

可以考虑用队列试试看,扫全表将等待处理的数据放入队列(单线程),然后多线程消费。由于出队本身具有原子性,可防止重复读,且性能有保证(特指redis)。此外,如果生产端单线程扫表还无法满足的话,可以考虑多线程取模读取数据放入队列。

迷茫

我有点不明白.上千万数据你不可能一次性全部拿到缓存里吧!!!!!

我又看你说表中每一条数据都有一个标记.<--修改之前看看这个标记不就行了.

在改动这条数据的时候.java端你只需要保证对这条数据的相关数据bean的操作(他可能是1步骤或者多步骤)
是原子性的就行了.<--当你改完他之后其他线程万一获取了数据就是你改过的了.

数据量大的update操作还是用jdbc的批量操作比较快.

PHP中文网

使用队列RabbitMQ ,生产者消费者模式

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号