老司机学习MyBatis之二级缓存的使用

一、前言

二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个Application应用。二级缓存也叫做全局缓存,基于namespace级别的缓存,一个namespace对应一个二级缓存。

①MyBatis将Application级别的二级缓存细分到Mapper级别,即对于每一个Mapper.xml,如果在其中使用了<cache> 节点,则MyBatis会为这个Mapper创建一个Cache缓存对象,如下图所示:


上述的每一个Cache对象,都会有一个自己所属的namespace命名空间,并且会将Mapper的 namespace作为它们的ID;
②多个Mapper共用一个Cache缓存对象(使用<cache-ref>节点配置)

如果你想让多个Mapper公用一个Cache的话,你可以使用<cache-ref namespace=””>节点,来指定你的这个Mapper使用到了哪一个Mapper的Cache缓存


二、案例

搭建一个新的Maven工程MyBatisTwoLevelCache


在我们使用框架时,大多数情况下都是配置大于编码

接下来我们将简单介绍一下如何配置二级缓存,步骤:

  • 开启全局二级缓存配置,<setting name=”cacheEnabled” value=”true”/>
  • 去mapper.xml中配置使用二级缓存 <cache></cache>
  • 我们的POJO需要实现序列化Serializable
步骤写好了,那就按照步骤一步一步来咯。。。

①修改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(缓存击中率),说明第二次查询数据从缓存中获取。
我们可以试着将cache配置注释掉,再次测试,可以看看打印结果有什么不同?大家可以自己尝试一下。
⑤但是大家要注意,二级缓存一定要在第一个会话关闭之后,第二个会话才能获取到缓存中数据,否则二级缓存失效
我们可以验证一下,修改测试方法

再次测试打印,控制台显示如下:

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,二级缓存失效。只有会话提交或者关闭后一级缓存中的数据才会转移到二级缓存中


=======欢迎大家拍砖,小手一抖,多多点赞哟!=======

版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。


猜你喜欢

转载自blog.csdn.net/gaomb_1990/article/details/80642066