Spring batch 如果我只需要使用ItemWriter删除行,为什么在作业步骤中需要ItemReader

Spring batch 如果我只需要使用ItemWriter删除行,为什么在作业步骤中需要ItemReader,spring-batch,Spring Batch,我在批处理作业中有一个步骤,我只想用它来删除表中的行 步骤如下所示: @Bean public Step step2(StepBuilderFactory factory, PurgeAggBalanceWriter writer, DataSource dataSource, PlatformTransactionManager platformTran

我在批处理作业中有一个步骤,我只想用它来删除表中的行

步骤如下所示:

@Bean 
    public Step step2(StepBuilderFactory factory,
                      PurgeAggBalanceWriter writer,
                      DataSource dataSource,
                      PlatformTransactionManager platformTransactionManager){
        return stepBuilderFactory.get("step2")
                .transactionManager(platformTransactionManager)
                .<Assessment,Assessment>chunk(10)
                .reader(getReader(dataSource, READER_QUERY2, "AggBalanceMapper", new AggBalanceMapper()))
                .writer(writer)
                .build();
    }
@Bean
公共步骤step2(StepBuilderFactory工厂,
PurgeAggBalanceWriter,
数据源数据源,
平台事务管理器平台事务管理器){
返回stepBuilderFactory.get(“step2”)
.transactionManager(平台transactionManager)
.chunk(10)
.reader(getReader(数据源,reader_QUERY2,“AggBalanceMapper”,新的AggBalanceMapper())
.作者(作者)
.build();
}
我使用这个writer类和jdcb模板来运行delete语句:

public class PurgeAggBalanceWriter implements ItemWriter<Assessment> {
   
    private JdbcTemplate jdbcTemplate;

    private static final String DELETE_QUERY = "DELETE FROM TABLE WHERE COLUMN = 'TEST'";

    public PurgeAggBalanceWriter(DataSource dataSource) {

        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }


    @Override
    public void write(List<? extends Assessment> list) {

        jdbcTemplate.update(DELETE_QUERY);

}
公共类PurgeAggBalanceWriter实现ItemWriter{
私有JdbcTemplate JdbcTemplate;
private static final String DELETE_QUERY=“DELETE FROM TABLE WHERE COLUMN='TEST';
公共PurgeAggBalanceWriter(数据源数据源){
this.jdbcTemplate=新的jdbcTemplate(数据源);
}
@凌驾
公共空白写入(列表)
我所要做的就是运行一个删除查询

在这种情况下,您不需要面向块的tasklet。一个简单的tasklet就足够了,比如:

public class DeletionTasklet implements Tasklet {

    private static final String DELETE_QUERY = "DELETE FROM TABLE WHERE COLUMN = 'TEST'";
    private JdbcTemplate jdbcTemplate;

    public DeletionTasklet(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        jdbcTemplate.update(DELETE_QUERY);
        return RepeatStatus.FINISHED;
    }
}

Howdy Mahmoud,我在删除少量行时对此进行了测试,它似乎工作正常,但当我使用此解决方案删除大量行时,会出现sql回滚异常:*com.ibm.db2.jcc.am.SqlNonTransientConnectionException:[jcc][t4][10335][10366][4.14.113]无效操作:连接已关闭。ERRORCODE=-4470,SQLSTATE=08003*似乎在某种程度上处于死锁状态…当我针对少量行运行任务时,任务工作正常,但最终需要删除数千行,这是我遇到此问题时…根据错误,连接似乎已关闭您的查询正在运行。我不是db2专家,但您需要将db2配置为允许长时间运行的查询。在Spring批处理端,tasklet将在事务中执行,您可以使用step builder
TransactionaAttribute()
方法(超时、隔离、传播等)配置该事务。无需重复类似问题:。将相关内容保留在同一线程中更有效。是否建议将数据分块处理以避免超时?