如何配置Spring Batch(使用Java配置)在单个事务中写入所有块?
我有一个简单的简单Spring Batch Job,只需一步。该步骤由JdbcCursorItemReader
,自定义项目处理器和自定义项目编写器组成。目前我在StepBuilder
上设置了块大小。这似乎也将提交间隔设置为相同的值。一方面,我不想将所有项目加载到内存中,因此需要进行面向块的处理。另一方面,处理器需要对所有项目进行单个事务,而不仅仅是当前块中的项目。它不会将项目存储在内存中。如果多次调用#write
,那就没关系了。
如何使用Java配置实现这一目标?
答案 0 :(得分:1)
IMO,这种方法打破了弹簧批量设计的方式。
春天批处理背后的整个想法是,你提交每个块,并且spring-batch跟踪已经处理的记录,以便提供重启,跳过和失败处理策略。
如果你真的需要整个过程的交易,为什么要使用弹簧批呢?我的意思是,你可以直接使用阅读器和编写器,并在你自己的简单循环中使用它们。这样的事情。
transaction.open();
while (not all processed) {
List currentChunk = new List..;
for(int i<0;i<chunkSize;i++) {
Object readItem = jdbcCursorItemReader.read();
if (readItem == null) {
break;
}
Object processedItem = processor.process(readItem);
if (processedItem != null) {
currentChunk.add(processedItem);
}
}
yourWriter.write(currentChunk);
}
transaction.commit();
答案 1 :(得分:0)
一次写出所有的块与SB设计和哲学相反
如果你想要你可以读取所有项目,将它们放在一个大块中并写入;你会得到同样的结果。
检查Spring Batch Chunk processing以获取可能的解决方案。