读完这个答案后(Michael Minella)
Spring batch chunk processing , how does the reader work ?if the result set changes?
我假设使用JdbcPagingItemReader,每个页面再次运行查询。在这种情况下,当读取新页面时,可能会在此页面开始之前的某个位置插入新记录,从而导致再次处理上一页的最后一条记录。
这意味着为了防止重新处理记录,我必须始终手动将“已处理”标记设置为输入数据并在写入之前进行检查? 这是一种可行的方法吗?
当进程中断(断电)并重新启动时,同样的问题适用于JdbcCursorItemReader。如果在保存到ExecutionContext的当前索引之前插入了新记录会发生什么?
答案 0 :(得分:1)
您的假设是正确的。
对于JdbcPagingItemReader,这还取决于事务的事务隔离级别(READ_COMMITED,READ_UNCOMMITTED,...)。
对于JdbcCursorItemReader,您必须确保在重新启动时查询返回完全相同的结果集(包括顺序)。否则结果是不可预测的。
在我写的批次中,我经常在第一步中将选择的结果保存到csv文件中,并使用" saveState = false"配置阅读器,如果我不能保证如果发生碰撞,选择将产生相同的结果。因此,如果第一步失败,重启将生成一个完整的新csv文件。在第一步之后,需要处理的所有条目都在文件中。当然,这个文件不能改变,因此,在重新启动的情况下,可以从第二步开始继续处理上一个成功的块。
编辑: 使用"州列"如果您只有一个步骤来执行读取(在where子句中具有状态列),处理和写入/更新(状态列到处理')状态,则效果很好。如果这样的工作失败,你只需要再次启动工作。