状態の永続性の防止
デフォルトでは、すべての 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
にエントリを作成しません。