2

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

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

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

4

3 回答 3

2

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

编辑:当您添加评论说您拥有相同的数据时,是的,我的解决方案就是您在寻找什么

  1. 通过单个查询获取数据集
  2. 将数据添加到队列
  3. 午餐你的线程(由执行者或新线程)
  4. 从队列中挑选数据并进行处理。
于 2013-08-07T06:06:44.040 回答
1

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

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

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

  1. 您(触发线程数 + 1)查询数据库。所以性能可能是个问题。
  2. 所有分区可能不相等(因为会有一些 id 被删除)。

这种方法很简单,并确保行仅由线程严格处理。

于 2013-08-07T06:43:34.567 回答
0

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

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

于 2013-08-07T05:59:01.230 回答