コミット間隔

前述のように、ステップは項目の読み取りと書き込みを行い、提供された PlatformTransactionManager を使用して定期的にコミットします。commit-interval が 1 の場合、個々の項目を書き込んだ後にコミットします。トランザクションの開始とコミットにはコストがかかるため、これは多くの状況で理想的とは言えません。理想的には、各トランザクションでできるだけ多くのアイテムを処理することが望ましいです。これは、処理されるデータの型と、ステップが対話するリソースに完全に依存します。このため、コミット内で処理されるアイテムの数を構成できます。

  • Java

  • XML

次の例は、tasklet の commit-interval 値が Java で定義されている 10 である step を示しています。

Java 構成
@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)
				.reader(itemReader())
				.writer(itemWriter())
				.build();
}

次の例は、tasklet の XML で定義されている commit-interval 値が 10 である step を示しています。

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

上記の例では、各トランザクション内で 10 個のアイテムが処理されます。処理の開始時に、トランザクションが開始されます。また、read が ItemReader で呼び出されるたびに、カウンターが増分されます。10 に達すると、集約されたアイテムのリストが ItemWriter に渡され、トランザクションがコミットされます。