批处理应用程序调用存储过程的正确块大小是多少?

时间:2018-02-19 14:34:55

标签: java spring spring-batch

  @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

时,我的提交计数更高

2 个答案:

答案 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属性,但不是两者。