java - 在多线程处理表数据的时候 ,怎么防止数据被重复处理?
迷茫
迷茫 2017-04-17 12:00:13
0
4
647

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


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

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

迷茫
迷茫

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

全部回覆(4)
伊谢尔伦

其實這個不是加鎖的問題,而是資料分發的問題。加鎖是為了防止高並發下產生髒數據,而你其實是希望處理過或已被其他線程先拿到的數據不要再處理了,對吧?

如何進行資料分發,提高叢集(或多執行緒)處理效率,這個要結合你們的資料模型來考慮。

例如處理的資料ID中有數字標識,目前你有10台機器或10個線程,那麼可以讓這10台機器各自讀取1/10的數據,這可以透過取餘(%10)做到。例如第1台機器讀取i%10==1的ID的數據,第2台讀取i%10==2的,以此類推。

黄舟

可以考慮用佇列試試看,掃全表將等待處理的資料放入佇列(單執行緒),然後多執行緒消費。由於出隊本身俱有原子性,可防止重複讀,且性能有保證(特指redis)。此外,如果生產端單執行緒掃表還無法滿足的話,可以考慮多執行緒取模讀取資料放入佇列。

迷茫

我有點不懂.上千萬資料你不可能一次全部拿到快取裡吧!!!!!

我又看你說表中每一條資料都有一個標記.

在改動這條資料的時候.java端你只需要保證對這條資料的相關資料bean的操作(他可能是1步驟或多步驟)
是原子性的就行了.

資料量大的update操作還是用jdbc的批次操作比較快.

洪涛

使用隊列RabbitMQ ,生產者消費者模式

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板