尽可能简洁,
我有一个主步骤,可以将执行分为并行的从属步骤。
这些从属设备都有自己的上下文,其中存储它们执行的线程的 ID,runNumber
。它们是读取器、处理器、写入器步骤。我关心的是这个奴隶的写作。我有一个 CompositeItemWriter,它有一个编写器,我想要执行一条 SQL 更新语句来更新数据库中线程的成功。作者如下:
@Bean
@StepScope
public JdbcBatchItemWriter<TraceDataDto> controlSuccessWriter(
@Value("#{jobExecutionContext['runNumber']}") int runNumber,
@Qualifier("veDataSource") DataSource veDataSource) {
JdbcBatchItemWriter<TraceDataDto> mysqlWriter = new JdbcBatchItemWriter<>();
mysqlWriter.setDataSource(veDataSource);
String sql = "UPDATE control SET status=1 WHERE run_number=" + runNumber;
mysqlWriter.setSql(sql);
return mysqlWriter;
}
现在,我遇到了麻烦,因为它抛出了一个错误:
java.lang.IllegalArgumentException: Using SQL statement with '?' placeholders requires an ItemPreparedStatementSetter
现在我知道有一条路径可以创建一个实现 ItemPreparedStatementSetter
的自定义类,但我担心这会通过将单个值映射到对象来产生不必要的开销。
有没有一种简单的方法可以将这个更新语句作为从属步骤的一部分执行?
最佳答案
Spring Batch 提供的 ItemWriter
实现预计会持久保存项目。这不是您想要做的,所以我建议创建一个 ItemWriter
(或者更好的监听器),它只使用 JdbcTemplate
来执行您需要的查询。
关于java - Spring Batch,作者中的更新语句?抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50683092/