关于多线程处理数据库存量数据的笔记

背景:现有一批存量数据需要处理,单线程每晚只能处理约4000条,故想采取多线程

遇到的困难:如何避免线程查询出 其他线程已查询出来,但未处理完毕的数据,进行重复无效的多次处理,或者造成其他数据问题

假设我们这里有12个线程,查询需要处理的数据条件是version=1,处理的操作是更新name字段,并且将version置为2

1.多线程启动时,按照数据的不同特点,拆分开来,不同线程处理不同的数据,比如:12个线程分别处理2020的12个月份的数据 
(目前使用的,但是我觉得有点笨,所以想看有没有其他方式)

2.在线程处理数据的时候,比如更新操作,更新的时候多加一个查询的条件,比如update table set name=zzz where id=? and version=1
  这样的话,避免了数据同时被多个线程更新,但是呢,并没有解决多个线程都查询到了这个数据的问题 
 (也有点笨,不建议,并且如果是通过javebean操作进行更新,那么仅根据id进行更新)
  
3.设置一个方法为线程安全的,这个方法的作用是查询数据,并且把数据设置为处理中,
这样其他线程在操作这批数据的时候,只取到这批数据里的不在处理中的其他数据,拿不到处理中的数据
 (这个看起来还行,但是如果数据库中不允许给打上这样的标记呢?再想想)
 

到这一步的时候,我意识到了这个问题其实不是线程安全的问题,而是数据分发的问题,我其实只是希望处理过或者已被其他线程先拿到的数据不要再处理了.
后面呢,通过思考和查阅资料,总结出来了以下两种方式

4.所有线程查询都是查询一样的数据,但是在处理的时候,可以通过取余进行判断,比如这个线程处理 id % 10=1的数据,
其他9个线程分别处理id % 10=2 到 9的数据

5.队列,先一次性查询出所有数据,把数据放入队列,多个线程从队列进行消费,队列可防止重复读。如果单线程一次性查询数据量过多,耗时慢,
在生产端,可以考虑多线程取模读取数据放入队列。


总结:   其实方法也都很简单,对于接触过的人可能一下子就能想到,但是由于工作对于高并发,多线程,分布式相关接触不多,后续要多加强下这些方面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值