【问题标题】:Spring Batch read and update from same table and multithreaded setup?Spring Batch 从同一个表和多线程设置读取和更新?
【发布时间】:2021-11-03 21:15:32
【问题描述】:

我遇到了与此问题中所述类似的问题。 Spring batch jpaPagingItemReader why some rows are not read?

我必须从表格中读取一些记录,例如

SELECT * FROM TABLE1 WHERE COLUMN1 = NULL

并根据其他列的值,进行一些处理(连接到 REST 服务)并获取一些数据并在 COLUMN1 中更新。

由于我使用RepositoryItemReadertaskExecutor,因此分页获取无法正常工作,并且大约一半的记录被从实际符合条件的记录中跳过。

为了避免这个问题,我将查询减少到SELECT * FROM TABLE1,这样分页就不会受到影响,因为查询将是幂等的。如果该列不为空,我将签入代码以跳过记录。即使使用此设置,记录仍会被跳过。 此外,仅当页面大小小于实际记录数时,才会出现此问题。 如果我保持页面大小大于或等于合格记录的总数,我不会遇到任何问题。我不确定这么大的页面大小(~100000)是否明智。 我注意到在这种情况下,单个查询检索所有记录,然后 taskExecutors 处理并在不同线程中写入这些记录。 由于数据量大,我无法避免多线程,因为单线程模式非常慢。

任何指针可以做什么?

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/68744338/…
  • 是的,我知道使用非幂等查询的影响。我从查询中删除了更改的列并将它们移至处理器。如果我使用 taskExecutor,每个线程会读取它自己的块吗?我的意思是每个线程都会有自己的read、process、flow?如何保证在多线程环境下,每个线程同步读取页面?

标签: java database multithreading spring-data-jpa spring-batch


【解决方案1】:

您基本上是在尝试在多线程步骤中实现流程指示器模式。这里有一个示例:Parallel sample。这个想法是使用带有进程指示器的临时表,而不是修改原始表。

也就是说,我不确定进程指示器模式是否可以使用分页技术来实现。在我看来,使用基于游标的阅读器按顺序读取每个分区的分区步骤是一个更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2013-08-09
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多