当前位置: 代码迷 >> Oracle开发 >> Hibernate <查询缓存>
  详细解决方案

Hibernate <查询缓存>

热度:62   发布时间:2016-04-24 06:33:05.0
Hibernate <查询缓存>

查询缓存:

  定义:查询缓存它是基于二级缓存的,可以保存普通属性查询的结果,查询对象实体时,他会保存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 exception15         }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 exception33         }finally{34             HibernateUtil.closeSession();35             36         }37         38     }

 

    总结:

      itetator不支持查询缓存

      list 开启查询缓存时,关闭二级缓存:

         在不同session中:第二次查询时,会发出n条查询id

         同一session中时,由于一级缓存的作用:所以无论有没有开启查询缓存都只有一条查询语句  

      list开启查询缓存时,开启二级缓存时:

         只执行一条查询语句,因为二级缓存生效了

 

    在缓存知识点中需要注意的:

      缓存不能随便用,尽量不用!

      在使用缓存时,还需要考虑到脏数据的问题!

      各级缓存的特点:

        一级缓存,save,get,load,query时都会产生缓存,这是无法禁止的

        二级缓存,二级缓存跨session操作,性能比较好,但是不能查询普通属性

        查询缓存,以键值对方式存放缓存,必须在程序中创建

        

  相关解决方案