查询缓存:
定义:查询缓存它是基于二级缓存的,可以保存普通属性查询的结果,查询对象实体时,他会保存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操作,性能比较好,但是不能查询普通属性
查询缓存,以键值对方式存放缓存,必须在程序中创建