查詢緩存:
定義:查詢緩存它是基於二級緩存的,可以保存普通屬性查詢的結果,查詢對象實體時,他會保存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操作,性能比較好,但是不能查詢普通屬性
查詢緩存,以鍵值對方式存放緩存,必須在程序中創建