一級緩存與休眠時的查詢緩存不同嗎?我看過關於第一級和查詢緩存的文章,所以我很困惑。Hibernate一級緩存vs查詢緩存
回答
一級高速緩存默認情況下處於啓用狀態,並且是基於每個會話的。查詢緩存默認情況下未啓用,在多個會話中共享,應始終與第二級緩存一起使用。
要啓用查詢緩存,以下性能應使用:
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=org.hibernate.cache.EhCacheProvider
hibernate.cache.use_query_cache=true
是的,是不同的東西。 就像Lee Chee Kiam所說的,一級緩存默認是啓用的,你不能禁用它。 基本上它是Hibernate在第一次放置取出的實體的位置,因此同一對象的第二個查詢不會實例化一個新對象,甚至可以通過ID避免查詢。有關此here的示例。
//Open the hibernate session
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
//fetch the department entity from database first time
DepartmentEntity department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1));
System.out.println(department.getName());
//fetch the department entity again
department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1));
System.out.println(department.getName());
session.getTransaction().commit();
HibernateUtil.shutdown();
Output:
Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=?
Human Resource
Human Resource
我們可以說第一級緩存是IdentityMap模式的Hibernate實現。
查詢緩存與實體嚴格相關,它在搜索條件和滿足特定查詢過濾器的實體之間繪製關聯(來自here)。 查詢緩存僅將查詢的原始結果保存爲主鍵,在hibernate speak,id's中。 它不包含實際的水合物。
查詢緩存如何工作?
假設我們有以下的條件查詢:
session.createCriteria(Person.class)
.add(Restrictions.eq("firstName", "Joey")
).setCacheable(true);
查詢緩存看起來概念等,其中的關鍵是通過查詢文本和參數值組成的哈希表,並將該值是實體的名單ID匹配查詢
*----------------------------------------------------------*
| Query Cache |
|----------------------------------------------------------|
| ["from Person where firstName=?", ["Joey"] ] -> [1, 2] ] |
*----------------------------------------------------------*
所以,下一次我們執行相同的標準查詢的,Hibernate會看那個哈希表,並解決了與人ID 1和2匹配的限制。 在這種情況下,你會避免查詢的成本(在這種情況下,幾乎爲零,但可能是一個昂貴的查詢與連接等),但你仍然會擊中數據庫查詢人員(現在通過ID什麼非常快)用於構建Person對象。 查詢緩存經常與第二級緩存一起使用,這需要第三部分實現,如Ehcache或infinispan。
二級緩存存儲實體數據,但不是實體本身。數據以「脫水」格式存儲,看起來像一個哈希映射,其中鍵是實體Id,並且該值是原始值列表。 這裏是一個如何的二級高速緩存查找的內容的例子:
*-----------------------------------------*
| Person Data Cache |
|-----------------------------------------|
| 1 -> [ "Joey" , "Q" , "Public" , null ] |
| 2 -> [ "Joey" , "D" , "Public" , 1 ] |
| 3 -> [ "Sara" , "N" , "Public" , 1 ] |
*-----------------------------------------*
因此,查詢緩存會爲我們提供了ID爲1和2,然後Hibernate會構造對象與在原始數據二級緩存,對應於id爲1和2的人。
查詢緩存和第二級緩存適用於具有多個讀取且很少或零更新的實體。因爲衆所周知的每種緩存類型都存在不一致的問題。因此,Hibernate將需要使緩存或刷新緩存無效(如果您有羣集緩存,則包含複製)。隨着許多更新,你會不斷地使緩存無效,它會做得更多的傷害,而不是好的。
從這個great post得到了一些解釋,你也應該閱讀這good answer。
- 1. Hibernate的緩存和MySQL查詢緩存
- 2. Hibernate中的一級緩存
- 3. HIbernate 2級緩存
- 4. 查詢Hibernate的緩存
- 5. hibernate存儲過程查詢緩存
- 6. 從Hibernate二級緩存中檢索所有Foo而沒有查詢緩存?
- 7. Hibernate查詢緩存下面指定緩存持續時間
- 8. FIFO緩存vs LRU緩存
- 9. 一個緩存vs多個緩存
- 10. Hibernate查詢緩存併發策略
- 11. Hibernate查詢緩存驅逐策略
- 12. 本機SQL查詢的Hibernate緩存
- 13. Hibernate查詢和會話緩存混淆
- 14. 與標準的Hibernate查詢緩存
- 15. 使用Criteria查詢進行Hibernate緩存
- 16. 休眠查詢緩存和二級緩存
- 17. 配置沒有第二級緩存的查詢緩存
- 18. Hibernate緩存?
- 19. 條件查詢緩存在Eclipselink緩存?
- 20. 關閉緩存中的緩存查詢
- 21. AppFabric緩存 - 查詢分佈式緩存
- 22. sqlalchemy緩存一些查詢
- 23. 如何僅在會話級別啓用hibernate查詢緩存?
- 24. 請問HQL查詢使用Hibernate二級緩存
- 25. 爲什麼不加入查詢命中Hibernate二級緩存?
- 26. Grails \ Hibernate:緩存還是不緩存?
- 27. 緩存SQL查詢
- 28. Magento查詢緩存
- 29. SQL查詢緩存
- 30. 查詢緩存mysql