前言
mybatis拥有自己的缓存,在缓存中他有三个重点:
- 一级缓存(局部缓存)
- 二级缓存(全局缓存)
- 自定义缓存
官网内容
缓存策略:
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
- 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
提示:(注解开发时)缓存只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。
一级缓存
- 一级缓存是默认开启的
- 它是sqlSession级别的,不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 一级缓存的作用域是同一个SqlSession,也就是这个SqlSession关闭的话,这个缓存也会关闭
- 本地缓存不能被关闭,可以调用clearCache()来清空本地缓存,或者改变缓存的作用域
二级缓存
- 二级缓存是mapper级别的
- 二级缓存是跨SqlSession的
- 二级缓存必须得SqlSession关闭之后才会在内容
环境
- 二级缓存是需要手动设置的
<settings>
<!--开启全局缓存(二级),其实默认就是开启的-->
<setting name="cacheEnabled" value="true"/>
</settings>
- 在需要开启缓存的xml中添加< cache/>标签
cache中有一些属性可以设置:
过程
- 一个SqlSession产生一个一级缓存
- 当这个SqlSession被关闭时,这个一级缓存也会失效
- 如果有开启二级缓存的话,一级缓存失效后,其中的内容换被保存在二级缓存中
- 新的SqlSession会从二级缓存中提取数据
- 每个mapper都拥有自己的二级缓存