一.缓存机制
1.一级缓存
一级缓存(本地缓存):
- 是SqlSession级别的缓存,实际上就是SqlSession级别的一个map。
- 每一个SqlSession对象都有自己的一级缓存,且互不共享。
- 一级缓存默认开启。
- 工作机制:与数据库的一次会话期间,通过一个SqlSession,查询到的数据会放在一级缓存中。
以后如果需要获取相同的数据,则直接从缓存中获取,而不需要发送sql到数据库查询,提高效率
一级缓存失效的情况:
- SqlSession不同
- SqlSession相同,但是查询条件不同 。
- SqlSession相同,但是在两次查询期间执行了增删改的操作。
- SqlSession相同,手动清除了一级缓存。
2.二级缓存
二级缓存:
-
全局缓存,是基于namespace级别的缓存。
-
默认关闭,需手动在mybatis全局配置文件中开启。
-
工作机制:
1.一个会话(SqlSession),查询一条数据,这个数据就会被放在当前会话的一级缓存中.
2.如果会话提交或者关闭,一级缓存中的数据会被保存到二级缓存中.使用步骤: 1.在全局配置文件中开启二级缓存: <setting name="cacheEnabled" value="true"/> 2.在想要使用二级缓存的sql映射文件中配置使用二级缓存: <cache></cache> 3.POJO需要实现序列化接口.
二级缓存在sql映射文件中的使用:
<!-- 配置使用二级缓存
eviction: 缓存的回收策略. 默认的回收策略是LRU
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
flushInterval:缓存的刷新间隔
缓存多长时间清空一次. 默认是不清空.
设置一个毫秒值
readOnly: 设置缓存是否只读
true: 只读. mybatis认为所有从缓存中获取数据的操作都是只读操作.不会修改数据.
mybatis为了提升获取速度,直接将数据在缓存中的引用交给用户.
效率快,不安全.
false:非只读. mybatis认为获取的数据可能会被修改. mybatis会利用序列化以及反序列化的技术
克隆一份新的数据交给用户
size:标识缓存能存放