gpt4 book ai didi

java - 通过不同的java线程从同一个数据库表中读取不同的数据集

转载 作者:行者123 更新时间:2023-12-01 10:14:53 27 4
gpt4 key购买 nike

我的问题与 this old SO question 非常相似并且那里没有发布令人满意的答案。

DB2中有一个数据库表,我试图通过两个或多个单独的Java线程进行并行记录读取,前提是这些线程应该读取不同的数据集,即如果THREAD-1已读取前1000条记录,则THREADS-2不应选择这些记录,而应选择不同的 1000 条记录(如果有)。

由于线程将读取不同的行,因此读取时不会发生冲突。连接对象也不会在线程之间共享 - 它们将使用自己的数据库连接。

数据库是 DB2,并且该表已在其中一列上进行范围分区。

线程数量不是固定的,而是可配置的,因此我们可以在更强大的机器上运行更多线程。

什么策略可以将读取器线程限制在表的特定区域而不是互相踩到对方的鞋子,即如何逻辑地划分表以便线程继续读取不同的区域? Java 进程可以利用 DB2 范围分区吗?

一种解决方案是将不同范围的主键移交给这些线程,但为此我必须在启动时读取整个表,而我试图避免这种情况。

最佳答案

一种方法是仅选择数据的一部分。假设您的 key 是一个数字(或者数字是您 key 的一部分),您可以在 WHERE 条件中使用模函数 (mod) - 这对于可配置数量的线程来说足够灵活。

SELECT... FROM... WHERE mod(key, 3) = 0 

对于三个线程中的第一个线程,mod(key, 3) = 1 对于第二个线程,依此类推。

如果您确实关注分区,则必须首先查询 DB2 系统目录以检索表的分区信息 (SYSCAT.DATAPARTITIONS)

关于java - 通过不同的java线程从同一个数据库表中读取不同的数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35958211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com