二级缓存:
定义:
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 或这查询前 取消一级缓存和二级缓存之间的交互,达到目的