2017-01-24 63 views
3

我們將Hibernate 3.5.6和Hazelcast 3.6.1一起用作二級緩存。我們有以下問題。我們有一個非惰性集合的Hibernate實體。在同一節點的兩個連續會話中向集合添加元素時,整個集合總是從數據庫重新加載。我預料到,當一個元素被添加到集合中時,第二級緩存可能會被更新,而不是完全從緩存中逐出並在每次添加其他條目時重新加載它。這是Hibernate二級緩存的一個主要問題,還是這是我們這邊的配置問題?更新二級緩存而不是無效

+0

這可能與緩存的容量有關。你檢查過了嗎? –

+0

... 0 0 <驅逐策略> LRU <驅逐策略> <最大尺寸策略=「PER_NODE」> 5000 <驅逐 - 百分比> 25 <最小驅逐 - 米利斯> 100 ...

+0

我改變相應的配置,但它並沒有改變行爲 –

回答

0

我想我可以自己回答這個問題。實際上休眠會不是更新集合,但總是使其無效。我發現下面解釋一下:http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache

哪些緩存語義?那麼,關鍵的一點是集合永遠不會在緩存中更新;它們只會從緩存中失效,然後可能會因其他數據庫讀取而再次緩存。所以,如果一個名爲Group.addMember()的應用程序,Hibernate會從緩存中刪除該組的成員集合。如果JBoss Cache是​​二級緩存實現,那麼刪除將在羣集周圍傳播;該集合將從集羣中所有節點上的緩存中刪除。

如果稍後應用程序需要訪問該組中的成員,則會發生另一個數據庫讀取,並且成員的當前主鍵集將被放入緩存中。

0

休眠緩存,默認情況下是鍵入PK,所以當你做一個findAll()時,它不會使用休眠緩存,當你做一個findOne(id)它會。

如果你想緩存findAll()我會使用ehcache和@Cache annoations,要小心它使用什麼密鑰緩存。見http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html

+0

我們的問題是,我們要的元素添加到收藏灰。 Hibernate將始終加載整個集合以向其添加元素。現在的問題是,如果集合無法從二級緩存(我不明白在我們的例子中)加載它將始終查詢數據庫加載整個集合。 –

+0

@JanSchaefer正確你必須自己扮演這個緩存的角色。我很高興被證明是錯誤的,但我經歷了與你多次完全相同的問題。 –