防止狀態持久化
預設情況下,所有 ItemReader
和 ItemWriter
實作都會在提交之前,將其目前狀態儲存在 ExecutionContext
中。然而,這可能不總是期望的行為。例如,許多開發人員選擇使用處理指示器,使他們的資料庫讀取器成為「可重新執行」的。在輸入資料中新增一個額外欄位,以指示是否已處理。當讀取(或寫入)特定記錄時,處理過的旗標會從 false
翻轉為 true
。然後,SQL 陳述式可以在 where
子句中包含額外的陳述式,例如 where PROCESSED_IND = false
,從而在重新啟動的情況下,確保僅傳回未處理的記錄。在這種情況下,最好不要儲存任何狀態,例如目前的列號,因為它在重新啟動時無關緊要。因此,所有讀取器和寫入器都包含 'saveState' 屬性。
-
Java
-
XML
以下 Bean 定義示範如何在 Java 中防止狀態持久化
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 中防止狀態持久化
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
中為其參與的任何執行建立任何條目。