在全局配置文件中配置
//开启全局二级缓存
<setting name="cacheEnabled" value="true"/>
在映射文件中
<cache eviction="" flushInterval=" " readOnly=""></cache>
参数解释:
eviction=“FIFO”:缓存回收策略:
•LRU –最近最少使用的:移除最长时间不被使用的对象。
•FIFO –先进先出:按对象进入缓存的顺序来移除它们。
•SOFT –软引用:移除基于垃圾回收器状态和软引用规则的对象。
•WEAK –弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
•默认的是LRU。
•flushInterval:刷新间隔,单位毫秒
•默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
•size:引用数目,正整数
•代表缓存最多可以存储多少个对象,太大容易导致内存溢出
•readOnly:只读,true/false
•true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
•false(默认):读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
POJO需要实现序列化接口
public class Employee implements Serializable {
private static final long serialVersionUID =1L;
...
}
测试
第二次缓存实在cache中拿到的数据,并没有发送新的sql,前提是查的都一样,前提是上一次的session关闭了,二级缓存中才会有数据
public void testSecondCache() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
SqlSession openSession1 = sqlSessionFactory.openSession();
try{
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
EmployeeMapper mapper1 = openSession1.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmpById(1);
System.out.println(emp01);
openSession.close();
Employee emp02 = mapper1.getEmpById(1);
System.out.println(emp02);
openSession1.close();
}finally {
}
}
相关参数
-
1.cacheEnabled=false,关闭二级缓存,一级缓存还存在
-
2.每个selece中useCache="true"
-
false:不使用缓存(一级缓存依然能够使用,二级不适用)
-
3./*重点掌握*/ 每个增删改标签 flushCache="true",一级二级缓存都会被清空
-
4.查询标签默认flushCache="true",如果改为false,每次查询之后缓存被清空
-
5.sqlSession.clearCache清除当前session的一级缓存
-
6.localCacheScope:本地缓存作用域
-
一级缓存SESSION,当前会话的所有数据保存在会话缓存中
-
STATEMENT:可以禁用一级缓存
第三方缓存整合
1.导入第三方缓存包,和ehcache.xml
2.在EmployeeMapper.xml中引用
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
3.想要在其他映射文件中(DepartmentMapper.xml)使用和上述相同的引用<cache-ref namespace="com.atguigu.mybatis.dao.EmployeeMapper"/>