一级缓存
- 一级缓存也叫本地缓存:sqlsession
- 与数据库同一次会话期间查询到的数据会放在本地缓存中
- 以后如果需要获取相同的数据直接从缓存中拿,没必要再去查询数据库
测试:
- 开启日志
- 测试一个session查询两次相同记录
- 查看日志输出
缓存失效的情况
- 查询不同的东西
- 增删改操作可能会改变原来的数据,所以必定会刷新缓存
- 查询不同的Mapper.xml
- 手动清理缓存
小结:一级缓存默认是开启的,只在一次sqlsession中有效,也就是拿到连接到关闭连接这个区间
二级缓存
二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
基于namespace级别的缓存,一个命名空间对应一个二级缓存
-
开启全局缓存(默认为true)
<!-- 显示的开启全局缓存 --> <setting name="cacheEnabled" value="true"/>
-
在当前mapper.xml中使用二级缓存(可以自定义参数)
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
-
测试
- 需要将实体类序列化,否则会报错
小结
- 只要开启了二级缓存,在同一个mapper下就有效
- 所有的数据都会先放在一级缓存中
- 只有会话提交或关闭才会提交到二级缓存中