### Mybatis一级缓存和二级缓存
缓存清除策略(二级)
- LRU(Least Recently Used):最近最少使用。移除最长时间不被使用的对象(MyBatis默认为此策略)
- FIFO(First In First Out): 先进先出。按照对象进入缓存的顺序来清除
- SOFT: 软引用。基于垃圾回收器状态和软引用规则来清除
- WEAK: 弱引用。更积极地基于垃圾回收器状态和弱引用规则来清除。
一级缓存(相当于一个Map )
- 作用域:只在建立连接的某一个SqlSession。该链接开启和关闭的区间内(默认开启,且无法关闭.)
- 缓存失效情况:
- 同一SqlSession下查询不同的内容。
- 在该SqlSession作用域下执行力增删改操作。(原因:缓存机制认为执行增删改之后,可能会改变原来数据。所以一定要刷新缓存。);
- 查询不同的Mapper.xml;
- 手动清理缓存。(SqlSession.clearCache);
二级缓存
-
作用域:二级缓存也叫全局缓存。基于namespace级别的缓存。一个名称空间对应一个二级缓存。
-
工作机制:
- 一个会话查询一条数据返回后。该数据会被放在当前会话的一级缓存中。
- 如果当前会话关闭了,该会话对应的一级缓存就没了。但我们需要一级缓存关闭后。一级缓存的内容被保存到二级缓存中;
- 新的会话查询信息就可以从二级中获取。
- 不同的Mapper查询出的数据会存放到自己对应的(map)缓存中
-
使用步骤:
-
开启全局缓存。在mybatis-config.xml中
<!--显式的开启全局缓存--> <settings> <setting name ="cacheEnabled" value = "true"></setting> </settings>
-
-
在对应的Mapper.xml中加入即可开启对应xml二级缓存
-
小结:
-
(1)只要开启了二级缓存,在同一个mapper下就有效
-
(2)所有数据都会先放在一级缓存中
-
(3)只有会话提交或者关闭的时候才会提交到二级缓存中。