防止状态持久化
默认情况下,所有的 ItemReader
和 ItemWriter
实现都会在提交之前将其当前状态存储在 ExecutionContext
中。然而,这并不总是理想的行为。例如,许多开发人员选择通过使用进程指示符来使他们的数据库读取器“可重新运行”。会在输入数据中添加一个额外的列,以指示该数据是否已被处理。当某个特定记录被读取(或写入)时,已处理标志会从 false
转变为 true
。然后,SQL 语句可以在 where
子句中包含一个额外的条件,例如 where PROCESSED_IND = false
,从而确保在重启时仅返回未处理的记录。在这种情况下,最好不存储任何状态(例如当前行号),因为这些状态在重启时是无关紧要的。因此,所有的读取器和写入器都包含了 'saveState' 属性。
- Java
- XML
下面的 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();
}
下面的 Bean 定义展示了如何在 XML 中防止状态持久化:
<bean id="playerSummarizationSource" class="org.spr...JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="rowMapper">
<bean class="org.springframework.batch.samples.PlayerSummaryMapper" />
</property>
<property name="saveState" value="false" />
<property name="sql">
<value>
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
</value>
</property>
</bean>
上面配置的 ItemReader
在其参与的任何执行过程中都不会在 ExecutionContext
中做任何记录。