Spring批處理可以提供聲明性跳過策略(即可跳過的異常類)來聲明特定記錄需要成爲在批處理中跳過。在spring批處理中,如何在寫入階段將記錄標記爲跳過的記錄(無重試)
這對於ItemReader和ItemProcessor(因爲它們按記錄基礎操作記錄)非常直接。
但是在ItemWriter的情況下,當記錄寫入失敗時(由於數據庫約束違規),我想跳過該記錄並讓其他記錄通過。
據我研究,我可以通過兩種方式實現這一點,
1)拋出的可跳過的異常,春季批次將開始試運行,每批次一個項目,因此,如果原來的批量大小是1000,那麼批處理會調用作者(和處理器,如果它是事務性的)1000次(每次記錄一次),並記錄跳過異常失敗的這個項目的skipCount(這很可能是相同項目在正常情況下失敗操作)
2)ItemWriter捕獲SQLException,並恢復處理下一條記錄直到條目列表結束。
第二種方法存在丟失多少記錄沒有通過的統計信息(即跳過的記錄),並且該批次將記錄所有項目被成功寫入,因此用不正確的值更新寫入計數。
第一種方法在我的用例中有點棘手,因爲它涉及所有項目的重新執行(在數據庫方面我們有複雜的SP +觸發器),因此不必要地花費更多時間。
我正在尋找一些合法的替代方法,以便在寫入階段只重新記錄跳過的記錄數。
如果沒有,我會去第一個選項。
謝謝!
我不希望將落實間隔設置爲1,因爲即使對於正面寫入,也會按順序創建DB語句創建+執行調用,從而降低系統速度 – jatanp 2015-01-21 18:20:47
如果您選擇一次提交10,並且其中一個10失敗,你將如何讓其他9持久化,因爲交易將被回滾。據我瞭解這是你的一個要求 - 堅持所有那些不失敗的人。 – 2015-01-22 09:40:14