如果查询结果发生变化,读者如何跟踪当前位置?

How do readers keep track of current position in case query result changes?

阅读此回答后(Michael Minella)

Spring batch chunk processing , how does the reader work ?if the result set changes?

我假设使用 JdbcPagingItemReader,每个页面的查询都是 运行。在这种情况下,当读取新的页面时,可能在该页面开始之前的位置插入了新的记录,导致重新处理上一页的最后一条记录。

这意味着为了防止记录被重新处理,我必须始终在输入数据中手动设置一个 "processed already" 标志并在写入之前检查它? 这是可行的方法吗?

当进程中断(断电)并重新启动时,同样的问题适用于 JdbcCursorItemReader。如果在保存到 ExecutionContext 的当前索引之前插入了一条新记录,会发生什么情况?

你的假设是正确的。

在 JdbcPagingItemReader 的情况下,这还将取决于您的事务的事务隔离级别(READ_COMMITED、READ_UNCOMMITTED、...)。

在 JdbcCursorItemReader 的情况下,您必须确保查询 returns 在重新启动的情况下具有完全相同的结果集(包括顺序)。否则后果难料。

在我写的批处理中,我经常在第一步将选择的结果保存到csv文件中,然后将reader配置为"saveState=false",如果我不能保证如果发生崩溃,选择将产生相同的结果。因此,如果第一步失败,重新启动将生成一个完整的新 csv 文件。第一步之后,所有需要处理的条目都在一个文件中。当然,这个文件不能更改,因此,在重新启动的情况下,可以从第二步开始从最后一个成功的块继续处理。

已编辑: 使用 "state-column" 效果很好,如果您只有一个步骤来执行读取(在其 where 子句中包含状态列)、处理和 writing/updating([=22= 的状态列) ]) 状态。如果这样的工作失败了,你只需要重新开始这个工作作为一个新的启动。