跳到主要内容
版本:6.0.2

防止状态持久化

DeepSeek V3 中英对照 Preventing State Persistence

默认情况下,所有 ItemReaderItemWriter 实现都会在提交前将其当前状态存储在 ExecutionContext 中。然而,这并非总是期望的行为。例如,许多开发者选择通过使用处理指示器使其数据库读取器具备"可重新运行"的能力。他们会在输入数据中添加一个额外列,用于指示数据是否已被处理。当读取(或写入)特定记录时,处理标志会从 false 翻转为 true。随后可以在 SQL 语句的 where 子句中添加额外条件,例如 where PROCESSED_IND = false,从而确保在重启时仅返回未处理的记录。在此场景中,最好不存储任何状态(例如当前行号),因为重启时这些状态无关紧要。因此,所有读取器和写入器都包含 saveState 属性。

以下 bean 定义展示了如何在 Java 中防止状态持久化:

@Bean
public JdbcCursorItemReader playerSummarizationSource(DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<PlayerSummary>()
.dataSource(dataSource)
.rowMapper(new PlayerSummaryMapper())
.saveState(false)
.sql("SELECT games.player_id, games.year_no, SUM(COMPLETES),"
+ "SUM(ATTEMPTS), SUM(PASSING_YARDS), SUM(PASSING_TD),"
+ "SUM(INTERCEPTIONS), SUM(RUSHES), SUM(RUSH_YARDS),"
+ "SUM(RECEPTIONS), SUM(RECEPTIONS_YARDS), SUM(TOTAL_TD)"
+ "from games, players where players.player_id ="
+ "games.player_id group by games.player_id, games.year_no")
.build();

}

上面配置的 ItemReader 不会在其参与的任何执行过程中向 ExecutionContext 写入任何条目。