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下,包含这个表的操作,那么数据不一致

举个简单的例子:

订单和订单详情,orderMapper、orderDetailMapper。在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息(在订单mapper里包含了订单详情的dml),那就是在orderMapper的namespace下修改,他是不会影响到orderDetailMapper的缓存的,那么你再次查找订单详情时,拿到的是缓存的数据,这个数据其实已经是过时的。

猜你喜欢

转载自www.cnblogs.com/brxHqs/p/9723822.html