2017-03-03 43 views
0

我有一個彈簧批量應用程序,它工作良好。它只是從文本文件中讀取並寫入到oracle表中。它在卡盤中執行加載。目前我已經配置了2000的卡盤大小。問題是,當我爲這項工作實現跳過監聽器時,spring會忽略我給出的塊大小,並且一次只將一條記錄插入到數據庫中。 Skip listerner只是將無效記錄寫入文本文件。這是春天批次如何工作?彈簧批量,塊大小和跳過監聽器一起

+0

」它一次只插入一條記錄到數據庫中。「 - 你確定每次都是在單獨的交易中完成的嗎?交易界限所需的塊。 –

+0

我只是使用spring提供的JdbcBatchItemWriter。我不寫任何交易相關的代碼。我剛剛配置了一個JPATransactionManager作爲spring bean。 – Vasanthakumar86

回答

0

在塊中,ItemWriter將始終首先嚐試寫入塊中的整個項目列表。但是,如果拋出可跳過的異常,框架需要找出哪個項目導致錯誤。

要做到這一點,事務回滾,然後逐項重試項目。這允許任何可能導致問題的項目傳遞給跳過監聽器。不幸的是,它也消除了塊的批處理。

通常,在處理器中進行預先驗證是可取的(並且性能會更好),因此您可以「過濾」這些項目而不是拋出異常並單獨重試項目。 「

+0

實際上,我的可跳過的異常是SQLExceptions。例如,如果我插入特定列的值超過最大長度。我們將得到SQLException。我將這個例外視爲可跳過的。這些驗證我們無法在處理器中完成。它只能在Writer類中完成。沒辦法,春天我們可以實現批量跳過功能嗎? – Vasanthakumar86

+0

你*絕對*可以檢查處理器中的字段長度。一種選擇是檢查每個字段並在必要時截斷。或者,您可以利用基於註釋的驗證(例如'@Column(nullable = false,length = 12)')來丟棄(過濾)您知道無法插入的項目。 –