mybatis的缓存可以减小数据库的压力
查询的顺序是:
- 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
- 如果二级缓存没有命中,再查询一级缓存
- 如果一级缓存也没有命中,则查询数据库
- SqlSession关闭之前,一级缓存中的数据会写入二级缓存
一级缓存
我们知道在默认条件下mybatis的一级缓存是开启的,localCacheScope=STATEMENT为关闭
可是通过查询,我们发现一级缓存竟然失效了
一级缓存失效条件
- 不是同一个SqlSession
- 同一个SqlSession但是查询条件发生了变化
- 同一个SqlSession两次查询期间执行了任何一次增删改操作
- 同一个SqlSession两次查询期间手动清空了缓存
- 同一个SqlSession两次查询期间提交了事务
查看打印信息,我们并没有提交事务,那就只能说明SqlSession对象发生了变化,通过debug,在类org.mybatis.spring.SqlSessionTemplate中执行了close方法
?每次查询,spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是不起作用的。观察sqlSession的对象,是一个DufaultSqlSession 的代理类,其实mybatis和spring结合使用的时候,将原本的DufaultSqlSession 替换成了SqlSessionTemplate ,并且在SqlSessionTemplate 中将sqlSession替换成了sqlSessionProxy 代理对象
?解决方法
开启事务。在开启事务的情况之下,spring使用ThreadLocal获取当前资源绑定同一个sqlSession,因此此时一级缓存是有效的。
只要操作是在一个事务中执行的,一级缓存就不会失效。
二级缓存
mybatis的二级缓存也是默认开启的,只需要配置一下就行了
?缓存命中
over?
|