2011-10-10 71 views
2

我需要在應用程序啓動過程中將我的用戶表與存儲庫(另一個數據庫)同步。我有兩個Apache mod_jk的Tomcat節點。所以當我重新啓動它們時,我會進行雙重插入和雙重更新。這似乎是: T1開始 T2開始 T1讀 T2讀取數據 T1修改數據 T2修改相同的數據的數據 T1插入 T2刀片 T1提交 T2提交Java Hibernate + Oracle 11.2鎖定

當T1修改數據,然後T2修改我丟失更新的相同數據。 當然,我在插入操作過程中有重複。 我應該如何做同步?

  1. 我想我可以使用「select * for update」(例如)鎖定所有表並執行兩個同步。一個滿了,另一個空着。
  2. 我可以爲此創建特殊表並將STATUS柱放在那裏。當一個節點啓動時,它執行STATUS字段的SELECT FOR UPDATE並將其更改爲「RUNNING」。當另一個事務讀取STATUS時,如果它設置爲「RUNNING」,它將不執行同步。

什麼是最好的解決方案?任何其他建議。 謝謝!

回答

1

的問題是,服務器啓動並不意味着應用程序啓動時,如果多臺服務器用於託管應用程序。

如果你總是啓動,並在同一時間同時停止服務器,僅僅只有其中的一個(通過在web.xml文件中的配置參數,或系統屬性)配置以執行同步。

如果每臺服務器可以啓動和停止獨立,那麼我不會做在啓動任何東西,而是實現它作爲應用程序的管理使用情況,並觸發其點播,從外面。

+0

謝謝!但我真的需要在啓動時做,而不是按需。該業務不想推「同步」按鈕))) – Nick

0

配置一臺服務器,這樣它不會做同步 - 就像JB Nizet說。在我們的項目中,我們使用Spring profiles

無論如何,如果你在一個業務鍵定義的唯一索引你不應該得到重複。您可以在Hibernate中使用optimistic locking擺脫Oracle的丟失更新。事務會嘗試更新特定版本(它讀取的版本),如果另一個事務使用新版本計數器更新它,則會發生錯誤。