我有一个包含大量行的MySQL数据库。
我想用Java初始化多个Threads(每个都有自己的数据库连接)并同时读取/打印数据。
如何在多个线程之间对数据进行分区,以便没有两个线程读取相同的记录?可以使用哪些策略?
答案 0 :(得分:2)
这取决于你的线程将要做什么样的工作。例如,我通常为某种大型数据集执行单个SELECT,将任务添加到线程安全任务队列,并提交从队列到进程中选择正确任务的工作者。我通常在没有同步的情况下写入DB,但这取决于工作单元的大小和DB约束(如唯一键等)。像魅力一样工作。 其他方法只是简单地运行多个线程并让它们自己工作。我强烈建议使用一些花哨的LIMIT,OFFSET。它仍然需要DB来获取比从查询实际返回的更多数据行。
编辑: 正如你添加评论,你有相同的数据,是的,我的解决方案是你在寻找什么
答案 1 :(得分:1)
如果大型数据集有整数主键,则其中一种方法如下
注意:此方法存在以下问题
这种方法很简单,并确保只有线程严格处理一行。
答案 2 :(得分:0)
您可以使用单例类来维护已读取的行。所以每个线程都可以从该单例中访问行号。
否则,您可以使用公共类中的静态AtomicInteger变量。每次线程都会调用getAndIncrement方法。因此,您可以在线程之间对数据进行分区。