缓存
因为查询要连接数据库,很耗性能,所以可以把临时数据缓存在内存中。在高并发的情况下可以减少去访问磁盘的次数,而只需要访问内存即可。
什么数据比较适合用缓存:经常查询且不经常改变的数据。
缓存失效的情况
1.查询不同的东西
2.增删改操作,可能会改变原来的数据,所以必定会刷新缓存。
3.查询不同的Mapper.xml
4.手动清理缓存
一级缓存
一级缓存是默认开启的,就是本地缓存,但是只在一次SqlSession中有效,也就是sqlsession.open()和sqlSession.close()这个区间段有效。
一级缓存的原理:就是一个Map
二级缓存
二级缓存即是全局缓存,即定义了<cache/>
的mapper.xml,整个namespace都会共享该缓存。
工作机制:
- 一个会话查询一条数据,把该数据存入一级缓存中;
- 如果当前会话关闭了,一级缓存就没了,就把它存入二级缓存中、
- 新的会话查询信息就可以从二级缓存中获取内容
- 不同的mapper存在的数据在不同的map中。
步骤:
- 开启全局缓存 mybatis-config.xml中
<setting name="cacheEnabled" value="true"/>
- 开启二级缓存 mapper.xml中
<!-- 在当前mapper.xml中使用二级缓存,也可以给它设置一些参数 -->
<cache/>
<!-- 设置参数之后 -->
<cache eviction="FIFO"
flushInterval="6000"
size="512"
readOnly="true"/>
如果某个方法不想用缓存,可以把useCache设置为false,如:
<select id="queryUserById" resultType="user" useCache="false">
select * from user where id = #{id}
</select>
- 测试的问题:
1 . 要把实体类序列化,否则无法缓存。
2 . 所有的数据都会先存在一级缓存中,只有当会话提交或者关闭的时候才会提交到二级缓存中
查询缓存顺序
先看二级缓存有没有,再看一级缓存有没有,最后才查数据库。