2013-10-22 250 views

回答

1

一級高速緩存默認情況下處於啓用狀態,並且是基於每個會話的。查詢緩存默認情況下未啓用,在多個會話中共享,應始終與第二級緩存一起使用。

要啓用查詢緩存,以下性能應使用:

hibernate.cache.use_second_level_cache=true 
hibernate.cache.use_query_cache=org.hibernate.cache.EhCacheProvider 
hibernate.cache.use_query_cache=true 
5

是的,是不同的東西。 就像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