Hibernate <二级缓存>

9/6/2015来源:Java教程人气:1545

Hibernate <二级缓存>

二级缓存:

  定义:

      1.二级缓存被称为进程级缓存或者sessionFactory级缓存,二级缓存可以被所有session共享

      2.二级缓存的生命周期和sessionFactory生命周期一样(sessionFactory生命周期需要在配置中设定),sessionFactory可以管理二级缓存

      3.二级缓存的数据是一级缓存放入的,也就是说二级缓存与一级缓存雷同,也是存放的实体类对象,对普通属性不执行缓存策略,不同的是生命周期的不同,二级缓存可以共享

  二级缓存需要配置才能够生效:

    1.引入第三方包ehcache

    2.在hibernate.cfg配置:

    我们需要配置三个地方: 一个是驱动提供,二个是 开启二级缓存,三个是配置需要缓存的实体类

 1 <!-- 二级缓存驱动提供 --> 2          <PRoperty name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 3         <!-- 二级缓存 --> 4          <property name="hibernate.cache.use_second_level_cache">true</property> 5        6 <!-- 缓存配置 --> 7 <class-cache usage="read-only" class="entity.Grade"/> 8 <!--与grade关联的对象 --> 9 <class-cache usage="read-only" class="entity.Student"/>10 <collection-cache usage="read-only" collection="entity.Grade.stu"/>

    注意:

      1.由于hibernate.cache.use_second_level_cache默认是开启的,我们也可以省略不写

      2.常用缓存策略:read-only / read-write

      3.缓存原则:读远大于写的时候使用缓存

    二级缓存在配置中开启时:

      当业务不需要使用二级缓存时:

      HibernateUtils.getSessionFactory.evict(实体对象.class);

      or

      HibernateUtils.getSessionFactory.evict(实体对象.class,1);//指定具体

      当我们不希望查询结果保存到二级缓存中:

      session.setCacheMode(CacheMode.IGNRE);//可以取消一级缓存和二级缓存之间的交互,这样可以达到当前sesison不能狗向二级缓存中保存数据

    补充:

      昨天笔记中提到大数据缓存处理,当我们开启二级缓存时,session.flush() session.clear()只能清除session级缓存,那么sessionFactory级/二级缓存怎么处理:

      这里我在视频中学习到一种方法:

      在save 或这查询前 取消一级缓存和二级缓存之间的交互,达到目的