2014-03-27 75 views
4

休眠中的一級緩存在會話對象上維持並且在同一個JVM的邊界內。這是hibernate使用的強制性緩存。我擔心如何在集羣環境中管理它。多個節點將擁有自己的第一級緩存(等於會話數)。在單個JVM中,一個實體可以是不同會話的一部分,但是事務管理器,樂觀鎖定處理情況....但是,我們如何在集羣環境中管理它?集羣環境中的休眠一級緩存

1)實體可以在兩個不同節點的一級緩存導致陳舊的數據問題,數據丟失問題。

2)如果我們使用樂觀鎖定....將很難恢復事務,並且還會影響其他節點上的其他有用事務。

3)我們不能對每一筆交易採取悲觀的鎖定。它會殺死休眠緩存的有用性。

4)隔離級別的設置也不起作用,因爲事務管理是由hibernate應用程序本身完成的,並且事務管理的邊界是一個JVM。

回答

1

第一級緩存不會產生陳舊的數據,我一直在羣集環境中使用JPA + Hibernate,沒有任何與之相關的問題。重要的是您的交易的隔離級別。我不希望其他節點讀取未被取消的數據,請確保至少使用READ_COMMITED級別。

+0

可能是你沒有得到錯誤,但如果節點不同,它不是一個無錯誤的安排。事務管理由hibernate應用程序本身完成。它不使用數據庫事務管理(除非悲觀鎖定)。隔離級別的邊界是單個JVM。 – user3082820

+1

我不同意。在休眠之下,你真正擁有的是數據庫事務,並且這兩個應用程序實例都攻擊同一個數據庫。如果app [node1]打開事務並刷新(不提交),app [node2]將讀取未被取消的數據,除非使用READ_COMMITED隔離級別。 – codependent

+0

Hibernate不使用DB鎖進行事務管理。檢查hibernate事務API。很少數據庫不支持所有類型的隔離級別。如果在Hibernate中設置READ_COMMITED隔離級別,那麼它不是數據庫的隔離級別。 Hibernate通過悲觀鎖定來獲取數據庫隔離。 – user3082820

3

您的第一條語句不正確,hibernate中的第一級緩存未在同一JVM的邊界內維護。它保持在休眠會話的邊界​​內。 Hibernate將會話(會話中的實體,這是第一級緩存)分開處理,即使在同一個jvm中,也可以在一個jvm中有多個休眠會話。

關於實體在集羣中不同節點上的不同第一級緩存中存在的問題與在同一個jvm上的兩個會話內的這些實體發生的問題相同。

可能是你沒有得到錯誤,但如果節點不同,它不是一個沒有錯誤的安排。事務管理由hibernate應用程序本身完成。它不使用數據庫事務管理(除非悲觀鎖定)。隔離級別的邊界是單個JVM。

hibernate中的事務管理直接映射到DB事務,通過調用「db transaction start」(通過JDBC或JTA)簡單地標記「hibernate事務啓動」。關於隔離級別,這與jvm沒有任何關係,並且不受其約束。

你的其他問題

廣東話您使用不同的節點上不同的隔離級別????如是???會發生什麼....如果不是?在哪個節點上你會得到一個錯誤信息?

這取決於執行的db語句的精確順序以及全局或使用DB事務設置的隔離級別。