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?)