1

有很多數據處理我試圖讓他們平行。數據庫多線程與主鍵保留序列更新

class Item{ 
    Integer id; 
    String data; 
} 


ExecutorService executor = Executors.newFixedThreadPool(10); 

for (Item item : items) { 
      executor.execute(() -> putItemToDB(item)); 
     } 

但出現的問題是,在一個測試的情況下,我有第一6個任務相同的主鍵。具有相同主鍵(id)的任務順序很重要,不能更改。目前,我沒有保證。

例子:

items = [{id: 1, data: "a"}, {id: 1, data: "b"}, {id: 2, data: "g"}] 

我必須知道a以前b,並運行在線程池的所有任務都不能保證。有可能,a將覆蓋b

有沒有什麼好的設計模式可以解決這個問題?

+0

發現目前還不清楚你在問什麼,因爲沒有什麼在這段代碼中揭示了什麼*「的任務具有相同主鍵的順序」 *其實意味着。 –

+0

我已經改進了我的問題。我希望現在可以。 –

回答

1

此用例的良好設計模式是爲每個id使用單獨的Actor實例。項目發送給相應的演員,並按順序保存在輸入隊列中。 Actor從隊列中取出下一個項目並保存在數據庫中。 要找到密鑰的actor,可以使用HashMap。

如果有太多不同的id和太多的actor,actor可以檢查它的輸入隊列是否爲空,然後從HashMap中註銷自己。

此類演員可以進行優化,以便不使用輸入隊列,而是可以使用單個項目的變量。如果另一個項目在前一個項目尚未寫入數據庫時​​到達,那麼新項目只是重寫上一個項目 - 無論如何,寫入舊項目沒有意義,它將被覆蓋在數據庫中。

一個簡單的演員開始可以在https://github.com/rfqu/CodeSamples/blob/master/src/simpleactor/SimpleActor.java

+0

我簡化了我的問題,因爲我不想讓它太複雜,但我必須保存每個記錄的ID DB,即使它會被覆蓋。感謝您的回答,我會更多地閱讀它。 –