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