二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个Application应用。二级缓存也叫做全局缓存,基于namespace级别的缓存,一个namespace对应一个二级缓存。
①MyBatis将Application级别的二级缓存细分到Mapper级别,即对于每一个Mapper.xml,如果在其中使用了
上述的每一个Cache对象,都会有一个自己所属的namespace命名空间,并且会将Mapper的 namespace作为它们的ID;
②多个Mapper共用一个Cache缓存对象(使用
如果你想让多个Mapper公用一个Cache的话,你可以使用
搭建一个新的Maven工程MyBatisTwoLevelCache
在我们使用框架时,大多数情况下都是配置大于编码
接下来我们将简单介绍一下如何配置二级缓存,步骤:
①修改mybatis-config.xml文件,添加如下配置
要注意settings配置在文件中的顺序,否则会报错
②修改EmpMapper.xml文件,增加如下配置
大家可以根据实际情况进行配置,具体配置说明如图
③修改POJO类Emp,实现序列化接口
④修改测试类MyBatisTest,增加testTwoLevelCache方法
测试打印,控制台显示如下:
2017-08-17 23:04:05,361 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] ==> Preparing: select id,emp_name empName,emp_email empEmail, dept_id deptId from t_emp where id = ?
2017-08-17 23:04:05,476 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] ==> Parameters: 1(Integer)
2017-08-17 23:04:05,518 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] <== Total: 1
Emp [id=1, empName=queen3aasd21, [email protected], deptId=1]
2017-08-17 23:04:05,543 [main] [com.queen.mybatis.mapper.EmpMapper]-[DEBUG] Cache Hit Ratio [com.queen.mybatis.mapper.EmpMapper]: 0.5
Emp [id=1, empName=queen3aasd21, [email protected], deptId=1]
控制台打印了一条SQL语句,可以看到打印结果上有一句Cache Hit Ratio(缓存击中率),说明第二次查询数据从缓存中获取。
再次测试打印,控制台显示如下:
2017-08-17 23:11:54,163 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] ==> Preparing: select id,emp_name empName,emp_email empEmail, dept_id deptId from t_emp where id = ?
2017-08-17 23:11:54,224 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] ==> Parameters: 1(Integer)
2017-08-17 23:11:54,275 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] <== Total: 1
Emp [id=1, empName=queen3aasd21, [email protected], deptId=1]
2017-08-17 23:11:54,285 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] ==> Preparing: select id,emp_name empName,emp_email empEmail, dept_id deptId from t_emp where id = ?
2017-08-17 23:11:54,285 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] ==> Parameters: 1(Integer)
2017-08-17 23:11:54,286 [main] [com.queen.mybatis.mapper.EmpMapper.findEmpById]-[DEBUG] <== Total: 1
Emp [id=1, empName=queen3aasd21, [email protected], deptId=1]
很明显,控制台打印了两段SQL,二级缓存失效。只有会话提交或者关闭后一级缓存中的数据才会转移到二级缓存中
=======欢迎大家拍砖,小手一抖,多多点赞哟!=======
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。