【问题标题】:Running a Spring Batch step in a single transaction在单个事务中运行 Spring Batch 步骤
【发布时间】:2020-12-20 20:12:43
【问题描述】:

我正在编写 Spring Batch 作业以:

  1. 从数据库表中读取一些记录
  2. 将它们写入文件
  3. 更新同一个数据库表上的相同记录

到目前为止,我的解决方案包括:

如何确保整个步骤在单个事务中运行?只有当步骤成功时,我才能提交数据库 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 spring-boot transactions spring-batch


【解决方案1】:

在单个事务中运行整个步骤首先不是面向块的处理模型的目的。原因显然是在处理大量数据时相关的长时间运行的事务。

也就是说,没有什么能阻止您创建一个自定义步骤实现,如果这对您有用,那么它可以在单个事务中完成工作,即使我不建议这样做。

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2015-10-17
    • 2023-03-13
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多