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 builderTransactionaAttribute()
方法(超时、隔离、传播等)配置该事务。无需重复类似问题:。将相关内容保留在同一线程中更有效。是否建议将数据分块处理以避免超时?