Mybatis学习(14)查询缓存之内置二级缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 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、查询操作比较多的时候使用二级缓存

这是因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新会降低系统的性能。

猜你喜欢

转载自blog.csdn.net/SDDDLLL/article/details/86578788
今日推荐