通过各种java线程从同一个DB表中读取不同的数据集

时间:2016-03-12 13:25:06

标签: java multithreading jdbc db2

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

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

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

数据库是DB2,此表已经在其中一列上进行了范围分区。

线程数量不会被修复但可配置,因此我们可以在更强大的机器上运行更多线程。

什么可能是将阅读器线程限制在桌子的特定区域而不是踩到彼此鞋子的策略,即如何逻辑地划分表格,以便线程继续在不同区域上阅读? Java进程可以使用DB2范围分区吗?

一种解决方案是将不同范围的主键切换到这些线程,但为此我必须在启动时读取整个表并且我试图避免。

1 个答案:

答案 0 :(得分:1)

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

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

表示三个中的第一个线程,而mod(键,3)= 1表示第二个,依此类推。

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