天天看點

Spring Batch 中的 chunk

我們都知道 Spring Batch 有 2 種任務方式。

主要是在 Step 階段,在 Step 階段,我們可以執行一個 Tasklet,我們也可以按照 Chunk 來執行。

主要差別

如果使用 Tasklet 的話,我們可以一個 Step 對應一個 Tasklet,Spring Batch 不允許一個 Step 對應多個 Tasklet。

考慮有一個場景,我們需要使用 Spring Batch 對資料庫中的表進行更新,這個表可能每次 Batch 要更新 幾千條資料,需要滿足每 5 分鐘更新一次。

如果我們采取 Tasklet 的方式的話,正常的思維都是讀取需要更新的資料,然後逐條進行更新。

這個沒有問題吧,但是恰恰問題就在這裡。

問題就是在 Spring Batch 使用的事務,Tasklet 在啟動的時候會建立一個事務,那麼讀取 1000 條資料,處理 1000 條資料,寫入 1000 條資料都在一個事務裡面。

假設這個處理時間超過 5 分鐘,下一次的任務又開始啟動了,這個時候 Spring Batch 還會啟動一個事務。

假設 10 分鐘了,我們還是沒有完成,Spring Batch 會繼續啟動任務和建立事務。

結果是什麼,這個顯而易見了,就是出現事務堆積,導緻鎖表,然後所有的任務都失敗,無法完成。

針對這種場景,我們就需要 chunk 了。

chunk

Chunk 的主要目的就是為了告訴 Spring 一次執行幾條記錄。

我們如果設定 Chunk 為 1 的話,那麼 Spring Batch 每次讀取一條記錄,處理一條記錄,寫入一條記錄,然後将這個事務進行送出。

這樣的話,可以有效的避免事務堆積導緻的鎖表。

​​

Spring Batch 中的 chunk

​​

繼續閱讀