簡體   English   中英

Spring Batch-當項目具有相互依賴性時,如何設置塊> 1?

[英]Spring Batch - How to set chunk > 1 when items have interdependencies?

我有一個Spring Batch作業,需要將所有項目寫到一個塊中。 我想要這種行為,因為

  1. 我需要做一些驗證,包括在寫入之前對已讀項目進行比較。
  2. 如果任何驗證失敗,則需要確保沒有任何項目持久化或所有項目持久化。
  3. 這是少量<60kb的數據。

該項目是Car ,並且具有Model屬性。 我遇到的問題是項目處理的一部分會檢查數據庫中是否已經存在Model 如果是這樣,它將從數據庫中檢索模型(包括自動生成的ID),因此不會創建另一個數據庫條目。

現在,如果該Model已在先前的作業運行中持久存在,則可以正常工作。 但是,當在同一作業中為兩個不同的Car顯示相同的Model並且該Model先前未被保留時,它將失敗。 在這種情況下,將為同一Model創建兩個數據庫行。

我正在將JPA與Model一起使用,其Model屬性具有@Id@GeneratedValue(strategy = GenerationType.IDENTITY)注釋。 如何在寫入之前確保同一Model不會多次寫入數據庫?

我會懷疑這種情況的發生是因為每個塊都由一個事務組成,並且您正在執行驗證並為該單個事務中的多個元素執行寫操作,而其中一次寫操作可能會使要寫入的另一項的驗證無效。

如果您真的想在這種情況下使用面向塊的處理,似乎您只需要在ItemProcessor實現某種緩存解決方案即可。 當創建一個新Model ,您將在一個類似Set模型中存儲該模型的標識符。 處理器每次處理Car項目時,都會檢查緩存,然后在創建新模型之前檢查數據庫中是否存在現有模型。

否則,您可以通過使用簡單的Tasklet步驟完全避免面向塊的處理。 這樣,您將完全控制邏輯事務。 進行面向塊的處理的主要原因是,您可以一次寫入一大堆項目以提高效率。 由於您要對每個項目的數據庫進行額外的驗證,因此您將失去一些好處。

如果您的Model表足夠小,則可以對其進行緩存,然后在內存中進行所有驗證。

以下是解決此問題的兩個選項:

  1. 創建Step以讀取/處理/寫入Model
  2. ItemProcessor<Car> ,檢查Model是否在數據庫中(如當前所做的那樣)。 如果它不在數據庫中,請在寫入所有Car之前繼續將其寫入數據庫。

選項1的缺點是:1)文件被讀取了兩次(對於Model一次,對於Car一次)。 2)如果Car步驟失敗,則可能是Model ,而沒有關聯的Car

選項2將對數據庫造成更多打擊。 但是,記錄數很少。 同樣, Model對數據庫的寫入與所有Car的寫入在同一事務中。 因此,如果Car不能持久保存,則其關聯的Model也會持久保存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM