【问题标题】:How to process List of items in Spring batch using Chunk based processing| Bulk processing items in Chunk如何使用基于块的处理处理 Spring 批处理中的项目列表|在 Chunk 中批量处理项目
【发布时间】:2021-05-28 15:51:24
【问题描述】:

我正在尝试实现一个 Spring 批处理作业,为了处理记录,它需要 2-3 次数据库调用,这会减慢记录的处理速度(大小为 100 万)。如果我使用基于块的处理它将分别处理每条记录,并且性能会很慢。因此,我需要一次性处理 1000 条记录作为批量处理,这将减少数据库调用并提高性能。但我的问题是,如果我实现 Tasklet,那么我也会失去可重启性和重试/跳过功能的功能,如果使用 AggregateInputReader 实现,我不确定对可重启性和事务处理会有什么影响。 根据下面的线程 AggregateReader 应该可以工作,但不确定它对事务处理和失败时的可重启性的影响:

Spring batch: processing multiple record at once

【问题讨论】:

  • I am trying to implement a Spring batch job where in order to process a record , it require 2-3 db calls which is slowing down the processing of records(size is 1 million):你能描述一下你设计的解决这个问题的算法,而不参考Spring Batch吗? I need to process 1000 records in one go as bulk processing which would reduce the db calls and performance would increase:假设您有一个包含 1000 条记录的列表,那么 2-3 db calls 将如何同时为每条记录(即您提到的批量)?
  • 处理过程就像它会从 db 中挑选一组 n 条记录(比如说 1000 条记录),并对每条“n”条记录进行转换/丰富。为了进行丰富/转换,它需要 2-3 次数据库调用。因此,为了提高性能,我计划为所有 1000 条记录敲击 db 2-3 次,即将有 2-3 个查询按顺序运行,这将获取所有 1000 条记录的丰富数据并将被加载在内存中,用于丰富所有 1000 条记录
  • 查询可以是 select * from table_name where id in (ids of all 1000 records)
  • 好的,我仍然不知道您将如何使用此类查询的结果,但如果您设法做到这一点,您可以使用ItemWriteListener 来批量丰富项目,如我的回答。如果由我决定并且一条记录的处理独立于其他记录,我将从多线程步骤或分区步骤开始。但您问题的准确答案是使用我的回答中提到的ItemWriteListener#beforeWrite
  • 不客气。我相信我回答了你的问题,所以如果答案有帮助,请接受它,stackoverflow.com/help/someone-answersPlease do not add a comment on your question or on an answer to say "Thank you".)。谢谢。

标签: spring-batch


【解决方案1】:

面向块的处理模型中的第一个扩展点是ItemWriteListener#beforeWrite(List items),它可以让您访问要写入的项目列表。因此,如果您不想在 ItemProcessor 中一次丰富一个项目,您可以使用该侦听器一次对整个块进行丰富。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多