Mybatis cache

Mybatis cache

mybatis的缓存有2种:
一级缓存
二级缓存

1、一级缓存

mybatis的一级缓存是默认开启的,一级缓存是SqlSession级别的

	* 同一个SQlSession调用同一个SQL语句的时候的缓存叫做1级缓存,一级缓存在以下情况会失效:
  * 1、不同的SqlSession对应不同的一级缓存
  * 2、同一个SqlSession但是查询的条件不同
  * 3、同一个SqlSession的两次操作之间执行了任意一次增删改操作
  * 4、同一个SqlSession手动清空了缓存
localCacheScope MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。 SESSION | STATEMENT SESSION

2、二级缓存

mybatis的二级缓存是默认开启的,二级缓存是映射文件级别的,二级缓存只会在第一个sqlsession commit或者close之后才生效

二级缓存的使用步骤如下

  • 在全局配置的标签中开启 cacheEnable=true
  • 在mapper.xml中通过来开启mapper.xml的缓存
  • 自定义POJO类必须实现Serialiazable

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html 官网参考

基本上就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

提示 缓存只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。

这些属性可以通过 cache 元素的属性来修改。比如:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

可用的清除策略有:

  • LRU – 最近最少使用:移除最长时间不被使用的对象。 --常用
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 --常用
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

默认的清除策略是 LRU。

提示 二级缓存是事务性的。这意味着,当 SqlSession 完成并提交时,或是完成并回滚,但没有执行 flushCache=true 的 insert/delete/update 语句时,缓存会获得更新

3、Mybatis自带缓存参数解析

一、全局配置

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!--开启分布查询的延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
  	<!--开启二级缓存-->
    <setting name="cacheEnabled" value="true"/>
</settings>

二、常用的标签

<cache
type = "引入第三方或者自定义的缓存"   <cache type="com.domain.something.MyCustomCache"/>
readonly = ""
eviction = "FIFO/LRU/SOFT/WEAK"
flushInterval = "6000ms"
size ="1024" />

<!--useCache 可以在mapper中绝对是否使用缓存-->
<!--flushCache 代表是否清空一级、二级缓存-->
<select useCache = "true" flushCache = "false" > <select/>

三、常用的java方法

sqlSession.close() // 关闭sqlSession,二级缓存生效
sqlSession.commit()// 提交sqlSession,二级缓存生效
sqlSession.rollback() // 回滚sqlSession,二级缓存生效
  
sqlSession.clearCache() //清空一级缓存,二级缓存不会收到影响

[//TODO so think about how to use disanfang cache?](//TODO so think about how to use disanfang cache?)

发布了85 篇原创文章 · 获赞 5 · 访问量 5892

猜你喜欢

转载自blog.csdn.net/shufangreal/article/details/105390980