我們將Hibernate 3.5.6和Hazelcast 3.6.1一起用作二級緩存。我們有以下問題。我們有一個非惰性集合的Hibernate實體。在同一節點的兩個連續會話中向集合添加元素時,整個集合總是從數據庫重新加載。我預料到,當一個元素被添加到集合中時,第二級緩存可能會被更新,而不是完全從緩存中逐出並在每次添加其他條目時重新加載它。這是Hibernate二級緩存的一個主要問題,還是這是我們這邊的配置問題?更新二級緩存而不是無效
回答
我想我可以自己回答這個問題。實際上休眠會不是更新集合,但總是使其無效。我發現下面解釋一下:http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache:
哪些緩存語義?那麼,關鍵的一點是集合永遠不會在緩存中更新;它們只會從緩存中失效,然後可能會因其他數據庫讀取而再次緩存。所以,如果一個名爲Group.addMember()的應用程序,Hibernate會從緩存中刪除該組的成員集合。如果JBoss Cache是二級緩存實現,那麼刪除將在羣集周圍傳播;該集合將從集羣中所有節點上的緩存中刪除。
如果稍後應用程序需要訪問該組中的成員,則會發生另一個數據庫讀取,並且成員的當前主鍵集將被放入緩存中。
休眠緩存,默認情況下是鍵入PK,所以當你做一個findAll()時,它不會使用休眠緩存,當你做一個findOne(id)它會。
如果你想緩存findAll()我會使用ehcache和@Cache annoations,要小心它使用什麼密鑰緩存。見http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html
我們的問題是,我們要的元素添加到收藏灰。 Hibernate將始終加載整個集合以向其添加元素。現在的問題是,如果集合無法從二級緩存(我不明白在我們的例子中)加載它將始終查詢數據庫加載整個集合。 –
@JanSchaefer正確你必須自己扮演這個緩存的角色。我很高興被證明是錯誤的,但我經歷了與你多次完全相同的問題。 –
- 1. NHibernate二級緩存手動無效
- 2. 休眠二級緩存更新
- 3. HazelCast分佈式二級緩存和更新失效
- 4. 運行JPQL更新語句時Hibernate二級高速緩存是否失效
- 5. 更新後觸發無效緩存
- 6. NHibernate二級緩存
- 7. 休眠:使第二級高速緩存無效
- 8. NHibernate的二級緩存,Memcached和隨機無效蒙上
- 9. 如何刷新二級緩存?
- 10. 更新緩存而不會阻止
- 11. 配置的二級緩存和數據不從二級緩存中加載
- 12. 在二級緩存中緩存NHibernate DetachedCriteria
- 13. firebase部署不更新html文件,而不是緩存問題
- 14. 有外部更新的NHibernate二級緩存
- 15. 休眠第二級緩存未得到更新
- 16. 休眠:batch_size?二級緩存?
- 17. Hibernate.initialize()和二級緩存
- 18. 二級緩存配置
- 19. Glassfish with infinispan二級緩存
- 20. 休眠二級緩存
- 21. 學說:二級緩存
- 22. 休眠二級緩存
- 23. NHibernate:二級緩存過期
- 24. 二級緩存不會在NHibernate中緩存過濾的集合?
- 25. 二級緩存 - 爲什麼不緩存所有實體?
- 26. NHibernate的二級緩存不緩存整個實體
- 27. NHibernate與二級緩存不Rehydrating屬性標記插入=「假」更新=「假」?
- 28. 從Hibernate二級緩存中檢索所有Foo而沒有查詢緩存?
- 29. LINQ到SQL無效的轉換上插入,而不是更新
- 30. 緩存失效內容更新
這可能與緩存的容量有關。你檢查過了嗎? –
我改變相應的配置,但它並沒有改變行爲 –