2015-01-21 25 views
0

Spring批處理可以提供聲明性跳過策略(即可跳過的異常類)來聲明特定記錄需要成爲在批處理中跳過。在spring批處理中,如何在寫入階段將記錄標記爲跳過的記錄(無重試)

這對於ItemReader和ItemProcessor(因爲它們按記錄基礎操作記錄)非常直接。

但是在ItemWriter的情況下,當記錄寫入失敗時(由於數據庫約束違規),我想跳過該記錄並讓其他記錄通過。

據我研究,我可以通過兩種方式實現這一點,

1)拋出的可跳過的異常,春季批次將開始試運行,每批次一個項目,因此,如果原來的批量大小是1000,那麼批處理會調用作者(和處理器,如果它是事務性的)1000次(每次記錄一次),並記錄跳過異常失敗的這個項目的skipCount(這很可能是相同項目在正常情況下失敗操作)

2)ItemWriter捕獲SQLException,並恢復處理下一條記錄直到條目列表結束。

第二種方法存在丟失多少記錄沒有通過的統計信息(即跳過的記錄),並且該批次將記錄所有項目被成功寫入,因此用不正確的值更新寫入計數。

第一種方法在我的用例中有點棘手,因爲它涉及所有項目的重新執行(在數據庫方面我們有複雜的SP +觸發器),因此不必要地花費更多時間。

我正在尋找一些合法的替代方法,以便在寫入階段只重新記錄跳過的記錄數。

如果沒有,我會去第一個選項。

謝謝!

回答

0

這指定在多少次執行寫入程序之後提交事務。

<chunk ... commit-interval="10"/> 

當你想跳過所有,而堅持到DB失敗的項目,你需要提交間隔爲1,以實際堅持的好項目,而不是被卷沿壞一回。

假設閱讀器只發送一個項目給處理器(而不是1000的列表)讀取器,處理器和寫入器會按順序執行每個項目。在這種情況下,選項2)不是有用的,因爲作者總是隻收到一個項目。

您可以通過調用StepContribution.html#incrementWriteCount以及此類的其他增量*計數方法來控制跳躍計數的增加方式。

+0

我不希望將落實間隔設置爲1,因爲即使對於正面寫入,也會按順序創建DB語句創建+執行調用,從而降低系統速度 – jatanp 2015-01-21 18:20:47

+0

如果您選擇一次提交10,並且其中一個10失敗,你將如何讓其他9持久化,因爲交易將被回滾。據我瞭解這是你的一個要求 - 堅持所有那些不失敗的人。 – 2015-01-22 09:40:14

相關問題