@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<PosRow, Prices>chunk(50)
.reader(reader())
.processor(processor())
.writer(new PriceWriter(dao))
.listener(stepListener)
.build();
}
在我的春季批处理应用程序中,我正在读取多个文件中的行,每个文件由3000
行组成。
我正在处理每一行,目前使用chunk
大小 50 。
处理完毕后,我每次都会在write()
中调用我的存储过程。我想了解应该为这些为每个订单项调用存储过程的处理类型设置的chunk size
应该是什么?有时我观察到处理和写作的滞后,我不知道为什么。任何建议或指示都会有所帮助。
每次运行应用程序时,我都会得到不同的提交计数:
@Slf4j
@Component
public class StepListener implements StepExecutionListener {
@Override
public void beforeStep(StepExecution stepExecution) {
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
log.info("Read count, {}", stepExecution.getReadCount());
log.info("Skip count, {}", stepExecution.getSkipCount());
log.info("Commit count, {}", stepExecution.getCommitCount());
log.info("Step {} finished!", stepExecution.getStepName());
return null;
}
}
读取计数和写入计数保持不变。
我发现当我使用块大小为1
时,我的提交计数更高答案 0 :(得分:0)
没有正确的尺寸;你需要确定一个在你的场景中有意义的东西。您可以尝试做一些基准测试,看看性能如何下滑。然而,50听起来像一个合理的数字,而基准标记可能不是很好地利用你的时间。
答案 1 :(得分:0)
我建议将chunkSize to 20
设置为SimpleCompletionPolicy
。
以下配置可确保在处理块(即大小为20)后进行提交。
public Step step1() {
return stepBuilderFactory.get("step1")
.<PosRow, Prices>chunk(new SimpleCompletionPolicy(20))
.reader(reader())
.processor(processor())
.writer(new PriceWriter(dao))
.listener(stepListener)
.build();
}
完成政策: -
在RepeatTemplate内部,终止了 迭代方法中的循环由CompletionPolicy确定 也是RepeatContext的工厂。 RepeatTemplate有 负责使用当前策略来创建RepeatContext和 在迭代的每个阶段将其传递给RepeatCallback。 回调完成其doInIteration后,RepeatTemplate具有 调用CompletionPolicy要求它更新其状态 (将存储在RepeatContext中)。然后它询问政策 如果迭代完成。
Spring Batch提供了一些简单的通用实现 CompletionPolicy。 SimpleCompletionPolicy允许执行最多a 固定次数(使用RepeatStatus.FINISHED强制提前 随时完成。)
用户可能需要实施自己的完成政策以获取更多信息 复杂的决定。例如,批处理窗口即 在使用在线系统后,可防止批处理作业执行 需要自定义政策。
· chunk-completion-policy:交易将在何时提交 这项政策决定完成。默认为SimpleCompletionPolicy 块大小等于commit-interval属性。
· commit-interval:将处理的项目数 在为事务调用commit之前。设置这个或者 chunk-completion-policy属性,但不是两者。