查詢緩存:
定義:查詢緩存它是基於二級緩存的,可以保存普通屬性查詢的結果,查詢對象實體時,他會保存id作為鍵,查詢結果作為值,下個對象訪問時,可以直接查到
查詢緩存查詢實體對象時,顯著的特點是,會執行多條查詢id查詢語句
生命周期:當關聯的表發生修改,查詢緩存的生命周期結束
查詢緩存的配置和使用:
1.修改hibernate.cfg
1 <!-- 開啟查詢緩存 默認為false --> 2 <property name="hibernate.cache.use_query_cache">false</property>
2.關聯實體類跟二級緩存配置一樣的
3.在程序中啟用:
query.setCacheable(true);
開啟查詢緩存,關閉二級查詢的情況下:
1 public void seleCacheTest(){
2 try {
3 session=HibernateUtil.currentSession();
4 session.beginTransaction();
5 List grade=session.createQuery("select g from Grade g")
6 .setCacheable(true)
7 .list();
8 for(int i=0;i<grade.size();i++){
9 Grade grad=(Grade)grade.get(i);
10 System.out.println(grad.getGradename());
11 }
12
13 } catch (Exception e) {
14 // TODO: handle exception
15 }finally{
16 HibernateUtil.closeSession();
17
18 }
19 System.out.println("-------------");
20 try {
21 session=HibernateUtil.currentSession();
22 session.beginTransaction();
23 List grade=session.createQuery("select g from Grade g")
24 .setCacheable(true)
25 .list();
26 for(int i=0;i<grade.size();i++){
27 Grade grad=(Grade)grade.get(i);
28 System.out.println(grad.getGradename());
29 }
30
31 } catch (Exception e) {
32 // TODO: handle exception
33 }finally{
34 HibernateUtil.closeSession();
35
36 }
37
38 }
總結:
itetator不支持查詢緩存
list 開啟查詢緩存時,關閉二級緩存:
在不同session中:第二次查詢時,會發出n條查詢id
同一session中時,由於一級緩存的作用:所以無論有沒有開啟查詢緩存都只有一條查詢語句
list開啟查詢緩存時,開啟二級緩存時:
只執行一條查詢語句,因為二級緩存生效了
在緩存知識點中需要注意的:
緩存不能隨便用,盡量不用!
在使用緩存時,還需要考慮到髒數據的問題!
各級緩存的特點:
一級緩存,save,get,load,query時都會產生緩存,這是無法禁止的
二級緩存,二級緩存跨session操作,性能比較好,但是不能查詢普通屬性
查詢緩存,以鍵值對方式存放緩存,必須在程序中創建