【发布时间】:2020-12-20 20:12:43
【问题描述】:
我正在编写 Spring Batch 作业以:
- 从数据库表中读取一些记录
- 将它们写入文件
- 更新同一个数据库表上的相同记录
到目前为止,我的解决方案包括:
- 从数据库读取的JdbcCursorItemReader
-
CompositeItemWriter 反过来又委托给
- ItemWriter 写入文件
- 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 Batch 呢?因为试图在一个事务中运行它基本上违背了首先使用 Spring Batch 的目的。
标签: spring spring-boot transactions spring-batch