- MyBatis系统中默认定义了两级缓存
- 默认情况下,MyBatis是开启了一级缓存(SqlSession级别的缓存,也称为本地缓存)
- 二级缓存需要手动开启和配置,它是基于namespace级别的缓存
- 为了提高扩展性,MyBatis定义了缓存接口Cache,我们可以通过Cache接口来自定义二级缓存
一级缓存
-
一级缓存也叫本地缓存
- 与数据库同一次会话期间查询到的数据会被放到本地缓存中
- 程序会先去缓存里面查找,缓存里没有再去查询数据库,并且将记录添加到缓存中
-
一级缓存失效的情况
- sqlSession 不同,每一个会话()
- 查询的两条语句不一样(内容 包括大小写要全部一致)
- 增删改会导致旧的查询记录失效
二级缓存
- MyBatis中默认 二级缓存是关闭的,需要我们自己手动开启
-
1、开启全局缓存
<setting name="cacheEnabled" value="true"/>
-
2、去每个mapper.xml中配置使用二级缓存,这个配置非常简单;【xxxMapper.xml】
<cache/> 官方示例=====>查看官方文档 <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> 这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用, 而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者 产生冲突。
-
- 只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
- 查出的数据都会被默认先放在一级缓存中
- 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中
读取数据的流程
- 首先先看二级缓存有没有开启,有开启先去二级缓存中查找数据
- 二级缓存中找不到,去一级缓存中查找数据
- 一级缓存也找不到,去数据库里面读取数据
- 数据库读取出来数据后,先写到一级缓存里面
- 等待当前会话提交或者是关闭后,将读取到的数据,从一级缓存中写入到二级缓存中