通过各种 java 线程从同一个数据库 table 读取不同的数据集
Reading different sets of data from same DB table by various java threads
我的问题和this old SO question很相似,没有满意的答案。
DB2 中有一个数据库 table,我正尝试通过两个或多个单独的 Java 线程对其进行并行记录读取,前提是这些线程应该读取不同的数据集,即如果 THREAD- 1 已读取前 1000 条记录,THREADS-2 不应 select 这些记录,但如果可用,则应读取不同的 1000 条记录。
由于线程将读取不同的行,因此预计在读取时不会发生冲突。连接对象也不会在线程之间共享——它们将使用自己的数据库连接。
数据库是 DB2,这个 table 已经在其中一列上进行了范围分区。
线程数量不是固定的,而是可配置的,因此我们可以 运行 在更强大的机器上使用更多线程。
将 reader 线程限制在 table 的特定区域并且不踩到彼此鞋子的策略是什么,即如何在逻辑上划分 table 以便线程继续阅读不同的地区? Java 进程可以利用 DB2 范围分区吗?
一种解决方案是将不同范围的主键移交给这些线程,但为此我必须在启动时阅读整个 table 并且我正在努力避免。
一种方法是 select 仅数据的一部分。假设您的密钥是一个数字(或者一个数字是您的密钥的一部分),您可以在 WHERE 条件下使用 modulo 函数(mod)——这对于可配置的线程数来说足够灵活.
SELECT... FROM... WHERE mod(key, 3) = 0
用于三个线程中的第一个线程,mod(key, 3) = 1 用于第二个线程,依此类推。
如果您真的关注分区,则必须先查询 DB2 系统目录以检索 table (SYSCAT.DATAPARTITIONS)
的分区信息
我的问题和this old SO question很相似,没有满意的答案。
DB2 中有一个数据库 table,我正尝试通过两个或多个单独的 Java 线程对其进行并行记录读取,前提是这些线程应该读取不同的数据集,即如果 THREAD- 1 已读取前 1000 条记录,THREADS-2 不应 select 这些记录,但如果可用,则应读取不同的 1000 条记录。
由于线程将读取不同的行,因此预计在读取时不会发生冲突。连接对象也不会在线程之间共享——它们将使用自己的数据库连接。
数据库是 DB2,这个 table 已经在其中一列上进行了范围分区。
线程数量不是固定的,而是可配置的,因此我们可以 运行 在更强大的机器上使用更多线程。
将 reader 线程限制在 table 的特定区域并且不踩到彼此鞋子的策略是什么,即如何在逻辑上划分 table 以便线程继续阅读不同的地区? Java 进程可以利用 DB2 范围分区吗?
一种解决方案是将不同范围的主键移交给这些线程,但为此我必须在启动时阅读整个 table 并且我正在努力避免。
一种方法是 select 仅数据的一部分。假设您的密钥是一个数字(或者一个数字是您的密钥的一部分),您可以在 WHERE 条件下使用 modulo 函数(mod)——这对于可配置的线程数来说足够灵活.
SELECT... FROM... WHERE mod(key, 3) = 0
用于三个线程中的第一个线程,mod(key, 3) = 1 用于第二个线程,依此类推。
如果您真的关注分区,则必须先查询 DB2 系统目录以检索 table (SYSCAT.DATAPARTITIONS)
的分区信息