我需要根据我在文件中收到的数据在两个表上运行更新。源是一个文件。
我尝试使用多个查询搜索JdbcBatchItemWriter。
目前我尝试了下面的方法,有1个工作和2个步骤 - 在这两个步骤中使用相同的阅读器,相同的处理器和相同的监听器 - 但我认为它是重复的。
<batch:job id="batchJob">
<batch:step id="step1" next="step2">
<batch:tasklet>
<batch:chunk reader="cvsFileItemReader" processor="myItemProcessor"
writer="mysqlItemWriter1" commit-interval="1" skip-limit="10">
<batch:listeners>
<batch:listener ref="stepListener">
</batch:listener>
</batch:listeners>
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:step id="step2">
<batch:tasklet>
<batch:chunk reader="cvsFileItemReader" processor="myItemProcessor"
writer="mysqlItemWriter2" commit-interval="1" skip-limit="10">
<batch:listeners>
<batch:listener ref="stepListener">
</batch:listener>
</batch:listeners>
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
我的itemWriter1和2运行更新,我需要获取两个查询的更新计数。
这只是我找不到的工作,但我觉得这还不够理想
如果我们可以在一个单独的编写器中使用多个更新查询,请告诉我。还建议是否有任何最佳方式。
谢谢
答案 0 :(得分:1)
你可以解决装饰JdbcBatchItemWriter
的问题:这个装饰者负责在ExecutionContext
中存储真正的作家真正写的多少项目,这样你就可以在后面的步骤中回来。
class CountingItemWriter implements ItemStreamWriter {
private JdbcBatchItemWriter delegate;
private int count = 0;
private final String id;
CountingItemWriter(String id) {
this.id = "CountingItemWriter#"+id;
}
write(List<?> items) {
delegate.write(items);
count += items.size();
}
open(ExecutionContext ec) {
count = getInt(this.id, 0);
}
update(ExecutionContext ec) {
ec.putInt(this.id, count);
}
close() {
// no-op
}
}
如果您有多位作家可以为每位作家检索正确的计数器,请记得给出不同的id
。