【发布时间】:2021-05-28 15:51:24
【问题描述】:
我正在尝试实现一个 Spring 批处理作业,为了处理记录,它需要 2-3 次数据库调用,这会减慢记录的处理速度(大小为 100 万)。如果我使用基于块的处理它将分别处理每条记录,并且性能会很慢。因此,我需要一次性处理 1000 条记录作为批量处理,这将减少数据库调用并提高性能。但我的问题是,如果我实现 Tasklet,那么我也会失去可重启性和重试/跳过功能的功能,如果使用 AggregateInputReader 实现,我不确定对可重启性和事务处理会有什么影响。 根据下面的线程 AggregateReader 应该可以工作,但不确定它对事务处理和失败时的可重启性的影响:
【问题讨论】:
-
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-answers(
Please do not add a comment on your question or on an answer to say "Thank you".)。谢谢。
标签: spring-batch