2009-09-22 51 views
3

我有一個多線程,多服務器Web應用程序,具有休眠和彈簧管理AOP事務。問題是,我需要維護內存中的數據,並保持與數據庫的狀態保持最新......實質上,我正在實現內存緩存。如何讓我的pojos交易?

現在,有什麼辦法讓我的內存中pojos事務與hibernate/spring事務相同嗎?我有服務調用分層深入30個類,我永遠不知道提交將發生在哪裏。我有什麼選擇?

回答

2

如果我理解得很清楚您的需要,您在某些情況下會問些微妙的東西。讓我嘗試一個例如,要檢查如果我理解正確

  1. 線程T1讀取POJO p在緩存中,得到版P1。
  2. 線程T2讀取緩存中的pojo P,獲取版本P1。
  3. 線程T2啓動事務,讀取相同的pojo,修改一個創建版本P2的值。
  4. 線程T1讀取緩存中的pojo P,仍然獲得版本P1。這要求對於點3,T2收到版本P1的副本P2,而不是同一個對象。
  5. 線程T2保存P,T1或T2沒有任何變化,它們有不同的版本。
  6. 線程T2關閉交易:
    a。如果回滾,則T2將使用P1,如T1所示。 b。如果提交,T2將繼續使用P2。但是現在T1也必須使用P2。

您可以看到這是一個複雜的問題,請不要低估它。 在理論層面上有許多問題需要解決(當你編碼時你會有更多的問題)。 如果您想成功使用它,您的架構將需要非常清晰。 如果不是,你冒着心理上的理智;-)

首先,你需要確保你真的想要這樣的東西!


如果你真的想要的..

我建議使用技術規範(AOP,ThreadLocal的),以隱藏你的功能代碼這個棘手的複雜性。

  • 很可能您的提交/回滾已經通過AOP完成,所以這應該不成問題。

  • 要隱藏P實例的檢索(有時是存儲高速緩存中的實例,有時是副本):使用名爲Store的類將值存儲在高速緩存中,並具有類型爲Store的ThreadLocal變量。我會用一個ThreadLocal變量爲你的當前線程:

    • 的存儲實例只能在你的交易AOP代碼進行更改,而不是在你的功能代碼
    • 你的功能代碼使用當前的ThreadLocal實例用於操縱實體(保存等)
    • 以外的事務,ThreadLocal實例是緩存的,我們稱之爲CACHE。
    • 輸入交易爲當前線程設置不同的ThreadLocal實例;該類是Store的一個子類,它會在您請求時返回緩存對象的副本;如果保存了某些類,那麼該類還將記憶(因此您需要使用此特殊API保存它們,或者在您的常規保存API中通知)
    • 回滾事務將拋棄ThreadLocal實例,重新安裝CACHED之一當前線程
    • commiting交易將採取一切記憶的數據庫操作的ThreadLocal實例,應用修改緩存的實例,並重新安裝緩存實例當前線程的
1

不使用Hibernate的2nd level cache不能滿足您的要求? JBoss Cache提供程序既是分佈式的,也是事務性的。

如果這不適合你,你將不得不解釋爲什麼你真的試圖獲得有意義的迴應。