2

我有一個基於MDB,Spring集成和JPA持久化的事件驅動的應用程序。 該應用程序部署在weblogic 10.3上,具有最大池大小默認值(16)。MDB上的競爭條件:哪個是處理它的最好方法?

我的應用程序需要處理一些修改數據庫的消息。 想象一下,我有一些用例,我必須處理一些消息,因爲它們的邏輯需要插入一個域對象,如果它不存在或更新它(如果它存在的話)。

所以我的組件如果對象存在或不然後調用JPA的合併是modifes數據庫檢查。 由於在我調用dao上的併發時併發執行兩個併發消息,JPA會觸發兩個insert語句,因爲該對象尚未保留,因此只有其中一個正確執行。

是否有事件驅動的應用程序來處理這種「競爭條件」的模式?

親切的問候 馬西莫

回答

1

最簡單的辦法是捕捉由第二刀片拋出的異常,然後再調用merge,這應該執行更新。

或者,也couldtry執行mergeSERIALIZABLE事務隔離,這確保直到第一個已完成第二merge被阻斷,然後第二個應執行的更新。

這個整個場景的主要問題是,如果你有要到,意味着改變一個給定的實體的多個併發事件,然後藿給你保證,你在執行他們在正確的順序?當然,你需要按順序處理,而不是同時處理?如果您使用併發事件使用者,那麼訂單將是非確定性的。

+0

好的,好的鏡頭。你知道可序列化的隔離級別是可序列化的節點還是集羣?我必須在具有2個節點的羣集上部署應用程序。親切的問候。 Massimo –

+0

@MassimoUgues:取決於您的事務管理器,但通常是數據庫級隔離,所以應該是集羣安全的。 – skaffman

+0

我使用spring JTA,所以它應該是集羣安全的。我正在考慮隔離= SERIALIZABLE,這將是一個很大的瓶頸。因爲我必須處理這種併發性,只對那些影響由相同ID標識的一些域對象的消息,我想到某種基於數據庫的監視器(例如某種選擇更新該ID)。你怎麼看待這件事? –