运行 Spring 单个事务中的批处理步骤
Running a Spring Batch step in a single transaction
我正在写一个 Spring 批处理作业到:
- 从数据库中读取一些记录table
- 将它们写入文件
- 更新同一数据库中的相同记录table
我目前的解决方案包括:
- 从数据库读取的JdbcCursorItemReader
- A CompositeItemWriter 又委托给
- 一个ItemWriter写入文件
- A JdbcBatchItemWriter 更新数据库中已处理的记录
如何确保整个步骤在单个事务中运行? 只有在步骤成功时我才能提交数据库 UPDATE
。
这里是相关的基于Java的配置代码:
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(...)
.reader(...)
.processor(...)
.writer(compositeWriter())
.build();
}
@Bean
public CompositeItemWriter<Person> compositeWriter() {
return new CompositeItemWriterBuilder<Person>()
.delegates(..., jdbcWriter())
.build();
}
@Bean
public JdbcBatchItemWriter<Person> jdbcWriter(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(...)
.sql("UPDATE ...")
.dataSource(dataSource)
.build();
}
运行 单个事务中的整个步骤首先不是面向块的处理模型的目的。原因显然与处理大量数据时的长 运行 事务有关。
也就是说,没有什么能阻止您创建一个自定义步骤实现,如果这对您有用的话,它可以在单个事务中完成工作,即使我不建议这样做。
我正在写一个 Spring 批处理作业到:
- 从数据库中读取一些记录table
- 将它们写入文件
- 更新同一数据库中的相同记录table
我目前的解决方案包括:
- 从数据库读取的JdbcCursorItemReader
- A CompositeItemWriter 又委托给
- 一个ItemWriter写入文件
- A JdbcBatchItemWriter 更新数据库中已处理的记录
如何确保整个步骤在单个事务中运行? 只有在步骤成功时我才能提交数据库 UPDATE
。
这里是相关的基于Java的配置代码:
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(...)
.reader(...)
.processor(...)
.writer(compositeWriter())
.build();
}
@Bean
public CompositeItemWriter<Person> compositeWriter() {
return new CompositeItemWriterBuilder<Person>()
.delegates(..., jdbcWriter())
.build();
}
@Bean
public JdbcBatchItemWriter<Person> jdbcWriter(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(...)
.sql("UPDATE ...")
.dataSource(dataSource)
.build();
}
运行 单个事务中的整个步骤首先不是面向块的处理模型的目的。原因显然与处理大量数据时的长 运行 事务有关。
也就是说,没有什么能阻止您创建一个自定义步骤实现,如果这对您有用的话,它可以在单个事务中完成工作,即使我不建议这样做。