版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SDDDLLL/article/details/86578788
前言
mybatis查询缓存的作用域是根据映射文件mapper的namespace划分的,相同namespace的mapper查询数据存放在同一个缓存区域中。不同namespace下的数据互不干扰。无论是一级缓存还是二级缓存都是按照namespace进行分别存放的。
但是一级、二级缓存的不同之处在于,SqlSession一旦关闭,则SqlSession中的数据将不存在,但是二级缓存的生命周期会与整个应用同步,与SqlSession是否关闭无关。
mybatis使用玩二级缓存的目的不是为了共享数据(这一点和hibernate不同),而是为了延长该查询结果的保存时间,提高系统的性能。
一、二级缓存的用法
1、实体序列化
要求查询结果涉及到的实体类都要序列化。如果该类具有父属性或者是具有域属性,那么相应的类也要实现序列化、
public class Student implements Serializable{
private Integer id;
private String name;
private int age;
private double score;
//get和set方法
//toString方法
}
2、在mapper映射中添加<cache/>标签
3、二级缓存的配置
此时为cache标签增加一些相关属性设置。
- eviction:逐出策略。当二级缓存中的对象达到最大值时候,就需要通过逐出策略将缓存中的对象移除缓存。默认是LRU。
- flushInterval:刷新缓存的时间间隔,单位是毫秒。这里的刷新缓存就是清除缓存。
- readOnly:设置缓存是否可读。
- size:二级缓存中可以存放的对象的个数。默认是1024个。
二、二级缓存的存在性证明
1、修改测试类
//根据id号选出学生
@Test
public void testselectStudentById() {
//第一次查询
sqlSession = MybatisUtil.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
Student student = dao.selectStudentById(24);
System.out.println(student);
//关闭SqlSession
sqlSession.close();
//第二次查询
sqlSession = MybatisUtil.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
Student student2 = dao.selectStudentById(24);
System.out.println(student2);
}
2、查看结果
可以看到,每执行一次就会计算一次命中率。第一次没有命中,为0,第二次命中了一次为0.5,第三次命中了两次为1/3
三、增删改对二级缓存的影响
增删改操作,无论是否进行提交sqlSession.commit(),均会清除一级缓存和二级缓存。
1、修改测试类
//根据id号选出学生
@Test
public void testselectStudentById() {
//第一次查询
sqlSession = MybatisUtil.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
Student student = dao.selectStudentById(24);
System.out.println(student);
//关闭SqlSession
sqlSession.close();
//增加一个删除操作
sqlSession = MybatisUtil.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
dao.deleteStuById(37);
//第二次查询
sqlSession = MybatisUtil.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
Student student2 = dao.selectStudentById(24);
System.out.println(student2);
}
2、查看结果
3、设置增删改操作不刷新二级缓存
如果要是某个增删改操作不清空二级缓存,则需要再起标签添加属性
4、关闭二级缓存
(1)全局关闭
(2)局部关闭
四、二级缓存的使用原则
1、只能在一个命名空间下使用二级缓存
由于二级缓存中的数据是基于namespace的,也就是不同的namespace中的数据互不干扰。如果我们在多个namespace中使用了二级缓存,那么在多个namespace中若存在对同一张表的操作,那么这多个namespace中的数据可能就会出现不一致的现象。
2、在单表上使用二级缓存
原因如上
3、查询操作比较多的时候使用二级缓存
这是因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新会降低系统的性能。