当前位置: 首页 > 知识库问答 >
问题:

不同Java线程从同一DB表中读取不同的数据集

韦寒
2023-03-14

我的问题与这个老问题很相似,但没有令人满意的答案贴在那里。

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

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

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

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

有什么策略可以将读取器线程限制在表的某个特定区域,而不是踩在彼此的鞋子上,即如何在逻辑上划分表,使线程在不同的区域上保持读取?Java进程可以利用DB2范围分区吗?

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

共有1个答案

许毅
2023-03-14

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

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

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

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

 类似资料:
  • 我试图创建一个环境,在这个环境中设置一个图形用户界面,当用户通过监听器修改它的组件时,另一个线程每隔X秒就向它添加新元素。(这是一个游戏,是的) 我希望游戏在一个类中,而“元素加法器”线程在另一个类中——但Java当然抱怨我无法从另一个线程修改JavaFX GUI。 我见过使用Platform.run稍后()的解决方案,但就我所知,所有这些解决方案都使用匿名内部类。我真的希望我的加法器在另一个(命

  • 首先,我在编码方面是个新手,所以我为我可能犯的任何隐语错误道歉 我正在使用Java(openJDK11)和Spring boot开发后端服务器: 该应用程序由许多面板和子面板组成,这些面板和子面板从web浏览器打开。单击子面板时,在前端执行三个不同的GET请求。 这三个请求需要不同的响应(json模式、json数据等)。每个请求启动一个访问相同配置文件的不同线程(每个子面板有一个配置文件),该配置

  • 我面临一个场景,我需要更新参数,并希望在同一事务中检索修改后的值 例如: 我的问题是,我们不能在同一事务中从bean本身检索修改后的值,而不是提交内部事务(即新事务)并从DB中检索它吗?

  • 我使用spring-data-redis(2.1.5.release)和jedis(2.10.2)客户端从作为spring-boot应用程序运行的不同服务连接到我的azure redis实例。 两个服务具有相同的缓存方法,并通过实现以下配置指向相同的缓存。am面临的问题是,当一个服务试图读取另一个服务创建的缓存值时,出现了去序列化异常。 例外情况: 注意:我使用redis只是为了缓存从我的数据库中

  • 我在C 11应用程序中有长时间运行的功能,基本上是。我需要通知这个函数在不同线程中出现。要求: 可以随时上升。 应用程序最多只能在一个地方处理(也可以不处理)。 它不需要超快速执行,也不需要延迟执行 截至目前,我考虑了两种选择: 传递包含。然后在<code>sub_main</code>内定期轮询对象,以了解新的<code>情况</code>。轮询对象已从队列中删除。当应用程序决定不处理特定位置的

  • 我有一个cron作业每30秒运行一次,检查未结束的游戏。我将用于固定线程池。cron作业调用此方法: 其中是。在方法内部,我在循环中调用一个api,直到没有下一个页面。在这个方法中,我想更新数据库,以记住我最后看到的页面。 是否可以在一个线程中更新数据库,然后启动另一个线程,其中数据库再次更新?