1. 程式人生 > >hibernate二級快取與查詢快取之間的關係

hibernate二級快取與查詢快取之間的關係

我們先看一下什麼樣的hibernate操作會將資料存入到一級快取中去,當呼叫下邊這些方法的時候會將資料存入到一級快取中

一級快取

save、update、saveOrupdate、load、list、iterate、lock,例如:

User userOne=new User();  
user.setName("名字"); 
//放入一級快取  
s.save(user);  
//查詢
User userTwo=(User) s.get(User.class, student.getId()); 

從一級快取中取資料的操作get、load、list
User user=(User) s.get(User.class, 45);                      
String hql="from User where id=45";  
User user2=(User) s.createQuery(hql).uniqueResult();    
System.out.println(stu2.getName());  

二級快取和查詢快取

二級快取是SessionFactory級別的全域性快取,它為每個類(或集合)提供快取。凡是呼叫二級快取的查詢方法都會從中受益,比如load,list,iterate等方法(注意,get和find不使用快取,直接訪問資料庫)。
開啟條件:
1)hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider(這裡指定了ehcache)
2)hbm.xml配置<cache usage="read-write"/>
3)ehcache.xml定義該類的cache
簡單地說,二級快取是用來儲存類物件的,並且填充它的所有屬性值。

查詢快取儲存的是查詢方法(list和iterate等)查詢的sql語句和結果集,跟load這種裝載物件的方法沒有關係。也就是說,使用load方法,查詢快取不理睬。
並且這個結果集只是物件id列表,物件的其他屬性值不儲存。例如,list執行的時候,先根據查詢快取中的sql語句,獲取物件id列表,然後再load(id)來取物件。
開啟條件:
1) hibernate.cache.use_query_cache=true
2)Query或者Criteria使用時,設定setCacheable(true)
簡單地說,查詢快取是用來儲存sql執行後獲取的物件id列表。下一次執行同一條sql時,可直接從查詢快取中獲取到物件id列表。


查詢快取是隻儲存物件的id的,並不去儲存真正的物件,查詢快取作為key值的是   hql語句+引數+分頁。