当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

提交间隔

正如前面提到的,step 会读取并写出 item,并借助提供的 PlatformTransactionManager 定期提交事务。如果 commit-interval 为 1,那么每写出一个 item 就会提交一次。 在很多场景下,这并不是理想方案,因为开启和提交事务本身是有成本的。 理想情况下,应当尽量在每个事务中处理更多 item,但这完全取决于所处理的数据类型, 以及 step 交互的外部资源。因此,你可以配置每次提交事务前要处理的 item 数量。

  • Java

  • XML

下面的示例展示了如何在 Java 中定义一个 taskletcommit-interval 为 10 的 step

Java Configuration
@Bean
public Job sampleJob(JobRepository jobRepository, Step step1) {
    return new JobBuilder("sampleJob", jobRepository)
                     .start(step1)
                     .build();
}

@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(10).transactionManager(transactionManager)
				.reader(itemReader())
				.writer(itemWriter())
				.build();
}

下面的示例展示了如何在 XML 中定义一个 taskletcommit-interval 为 10 的 step

XML Configuration
<job id="sampleJob">
    <step id="step1">
        <tasklet>
            <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
        </tasklet>
    </step>
</job>

在前面的示例中,每个事务会处理 10 个 item。处理开始时,会先开启一个事务。 之后每次调用 ItemReaderread 方法,计数器都会加一。 当计数达到 10 时,聚合后的 item 列表就会传递给 ItemWriter,随后提交事务。