gpt4 book ai didi

java - 在 Spring Batch JdbcBatchItemWriter 中添加多个更新查询

转载 作者:行者123 更新时间:2023-11-30 06:11:31 25 4
gpt4 key购买 nike

我需要根据我在文件中收到的数据对两个表运行更新。源是一个文件。

我尝试使用多个查询搜索 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 运行更新,我需要获取两个查询的更新计数。

这只是我发现的解决办法,但我认为这还不够优化

请告诉我我们是否可以在一个编写器中使用多个更新查询。还建议是否有任何最佳方法。

谢谢

最佳答案

您可以解决装饰 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,以便能够为每个写入器检索正确的计数器。

关于java - 在 Spring Batch JdbcBatchItemWriter 中添加多个更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com