mybatis缓存(一,二级别)

数据查找过程:

  • 二级缓存(默认关闭) -> 一级缓存(默认开启) -> 数据库

一级缓存:

  • 一级缓存是SqlSession自带的。SqlSession对象被创建,一级缓存就存在了。//是针对每一个sqlSession进行缓存。
  • 如果SqlSession对象关闭或调用清理方法,会导致缓存失效。
  • 缓存底层实现就是通过HashMap实现的。
  • 一级缓存介质——内存

如果 执行sqlsession的DML等操作,会执行commit(提交事务),最终会清空缓存(flush)。sqlSession对象销毁,一级缓存数据不存在了。sqlSession与SqlSession之间的一级缓存互相不影响。

二级缓存:

二级缓存是针对每个mapper相同 的namespace进行缓存每个SqlSession都会首先调用mapper下的sql语句,每个mapper缓存各自的数据(存储了查询的结果集(java对象))。
每个SqlSession都可以访问到二级缓存中的数据(二级缓存SqlSessionFactory进行管理的),sqlsession对象销毁,mapper中的二级缓存数据仍然存在。

  • 二级缓存介质——内存,硬盘(内存不够走硬盘)
  • 二级缓存SqlSessionFactory(多个SqlSession共享)进行管理的。

.二级缓存的原理:

  • Mybatis框架提供了Cache接口,缓存组件(比如redis)实现接口。//用redis做mybatis二级缓存:首先开启全局配置开关,然后编写cache的实现类,重写方法,然后在xxxClass的mapper文件里在<cache />标签里设置type属性,指定缓存实现类

二级缓存配置:

1.打开总开关: 
在核心配置文件SqlMapConfig.xml中加入

<!--注意顺序-->
<setting name="cacheEnabled" value="true"/>

2.在需要开启二级缓存的mapper.xml中加入caceh标签  <caceh/>

3.二级缓存的POJO类实现Serializable接口

二级缓存失效情况:

1.在查询select标签内设置useCache="false",强制关闭二级缓存,如果要使用,得打开

<selectid="getStuById" parameterType="Integer"resultType="Student" useCache="false">

selectstu_id stuId,stu_name stuName from tbl_student where stu_id=#{stuId}

</select>

2.在执行DML操作时刷新缓存

<updateid="updateStu"parameterType="com.atguigu.mybatis.entity.Student" flushCache="true">

updatetbl_student set stu_name=#{stuName} where stu_id=#{stuId}

</update>

这是默认设置(不启动二级缓存),通常不必修改

二级缓存使用场景:

前提:

1.对于查询多,DML少,实时性要求不高(缓存一般都用在这种场景)

2.只有单表操作的表上使用二级缓存,并且所有关于这个表的操作都得在一namespace下   //其他namespace下,包含这个表的操作,那么数据不一致。比如user表,role表,userRole表,不管userRole表的查询放到user的namespace下,还是role的namespace下,user或role的表数据变更后,都会导致userRole的查询有误差

原文地址:https://www.cnblogs.com/brxHqs/p/9723822.html