2015-09-14 29 views
0

如何配置Spring批处理(使用Java配置)在单个事务中写入所有块?Spring批处理Java配置提交间隔

我有一个简单的简单的Spring批处理作业,只需一步。该步骤由JdbcCursorItemReader,一个自定义项目处理器和一个自定义项目编写器组成。目前,我在StepBuilder上设置了块大小。这似乎也将提交间隔设置为相同的值。一方面,我不想将所有项目加载到内存中,因此需要面向块的处理。另一方面,处理器需要对所有项目进行单个事务,而不仅仅是当前块中的项目。它不会将项目存储在内存中。没关系,如果#write被多次调用。

如何使用Java配置来实现?

回答

1

IMO,这种方法打破了春季批次的设计方式。

Spring批处理背后的全部想法是,你承诺每个块,并且Spring-batch跟踪哪些记录已经被处理,以便提供重启,跳过和失败处理策略。

如果你真的需要在整个过程中进行交易,为什么要使用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(); 
+0

我不知道这是否可以用一个步骤执行侦听器来完成。 –

+0

我想可能是。我们将尝试在beforeStep方法中打开事务,并在afterStep方法中提交它。我不确定的是:我们能以某种方式配置作者使用我们自己的事务吗?但是,仍然存在这个问题,我们绕过了SB的核心概念。而且,它也只适用于小的工作量,因为我们通常不想长时间运行事务。 –

0

在一次写所有块是相反的SB设计和哲学。
如果你想要你可以阅读所有的项目,把它们放在一个大块并写入;你将获得相同的结果。
检查Spring Batch Chunk processing寻求可能的解决方案。

+0

不,它不会是相同的结果。所有项目都将存储在内存中,这仅适用于小型工作负载。 –

+0

是的,你是对的。但我不知道如何破解SB交易管理 –

相关问题