我有一個多線程,多服務器Web應用程序,具有休眠和彈簧管理AOP事務。問題是,我需要維護內存中的數據,並保持與數據庫的狀態保持最新......實質上,我正在實現內存緩存。如何讓我的pojos交易?
現在,有什麼辦法讓我的內存中pojos事務與hibernate/spring事務相同嗎?我有服務調用分層深入30個類,我永遠不知道提交將發生在哪裏。我有什麼選擇?
我有一個多線程,多服務器Web應用程序,具有休眠和彈簧管理AOP事務。問題是,我需要維護內存中的數據,並保持與數據庫的狀態保持最新......實質上,我正在實現內存緩存。如何讓我的pojos交易?
現在,有什麼辦法讓我的內存中pojos事務與hibernate/spring事務相同嗎?我有服務調用分層深入30個類,我永遠不知道提交將發生在哪裏。我有什麼選擇?
如果我理解得很清楚您的需要,您在某些情況下會問些微妙的東西。讓我嘗試一個例如,要檢查如果我理解正確:
- 線程T1讀取POJO p在緩存中,得到版P1。
- 線程T2讀取緩存中的pojo P,獲取版本P1。
- 線程T2啓動事務,讀取相同的pojo,修改一個創建版本P2的值。
- 線程T1讀取緩存中的pojo P,仍然獲得版本P1。這要求對於點3,T2收到版本P1的副本P2,而不是同一個對象。
- 線程T2保存P,T1或T2沒有任何變化,它們有不同的版本。
- 線程T2關閉交易:
a。如果回滾,則T2將使用P1,如T1所示。 b。如果提交,T2將繼續使用P2。但是現在T1也必須使用P2。
您可以看到這是一個複雜的問題,請不要低估它。 在理論層面上有許多問題需要解決(當你編碼時你會有更多的問題)。 如果您想成功使用它,您的架構將需要非常清晰。 如果不是,你冒着心理上的理智;-)
首先,你需要確保你真的想要這樣的東西!
如果你真的想要的..
我建議使用技術規範(AOP,ThreadLocal的),以隱藏你的功能代碼這個棘手的複雜性。
很可能您的提交/回滾已經通過AOP完成,所以這應該不成問題。
要隱藏P實例的檢索(有時是存儲高速緩存中的實例,有時是副本):使用名爲Store的類將值存儲在高速緩存中,並具有類型爲Store的ThreadLocal變量。我會用一個ThreadLocal變量爲你的當前線程:
不使用Hibernate的2nd level cache不能滿足您的要求? JBoss Cache提供程序既是分佈式的,也是事務性的。
如果這不適合你,你將不得不解釋爲什麼你真的試圖獲得有意義的迴應。