在Java线程中分发数据库读取作业的最佳方法

时间:2013-08-07 05:53:17

标签: java multithreading jdbc

我有一个包含大量行的MySQL数据库。

我想用Java初始化多个Threads(每个都有自己的数据库连接)并同时读取/打印数据。

如何在多个线程之间对数据进行分区,以便没有两个线程读取相同的记录?可以使用哪些策略?

3 个答案:

答案 0 :(得分:2)

这取决于你的线程将要做什么样的工作。例如,我通常为某种大型数据集执行单个SELECT,将任务添加到线程安全任务队列,并提交从队列到进程中选择正确任务的工作者。我通常在没有同步的情况下写入DB,但这取决于工作单元的大小和DB约束(如唯一键等)。像魅力一样工作。 其他方法只是简单地运行多个线程并让它们自己工作。我强烈建议使用一些花哨的LIMIT,OFFSET。它仍然需要DB来获取比从查询实际返回的更多数据行。

编辑: 正如你添加评论,你有相同的数据,是的,我的解决方案是你在寻找什么

  1. 通过单一查询获取数据集
  2. 将数据添加到队列
  3. 午餐你的线程(通过执行者或新线程)
  4. 从队列中挑选数据并进行处理。

答案 1 :(得分:1)

如果大型数据集有整数主键,则其中一种方法如下

  • 使用相同的选择查询获取行数。
  • 将整个数据集划分为相同数量的分区
  • 为每个thead分配每个分区。每个线程都有自己的select查询,主键值范围为约束。

注意:此方法存在以下问题

  1. 您(消防线程数+ 1)查询数据库。因此性能可能会成为一个问题。
  2. 所有分区可能不相等(因为会删除一些ID )。
  3. 这种方法很简单,并确保只有线程严格处理一行。

答案 2 :(得分:0)

您可以使用单例类来维护已读取的行。所以每个线程都可以从该单例中访问行号。

否则,您可以使用公共类中的静态AtomicInteger变量。每次线程都会调用getAndIncrement方法。因此,您可以在线程之间对数据进行分区。