一级缓存:
-
Mybatis的一级缓存的作用域是session,当openSession()后, 如果执行相同的SQL (相同语句和参数),Mybatis不进行执行SQL,而是从缓存中命中返回。
-
原理:Mybatis执行查询时首先去缓存区命中,如果命中直接返回,没有命中则执行SQL,从数据库中查询。
-
在mybatis中,一级缓存默认是开启的,并且一直无法关闭(我们没法去管理一级缓 存)
例如:
代码测试:
日志输出:
一级缓存满足条件:
- 同一个session中
- 相同的SQL和参数
使用sqlsession.clearCache()强制查询不缓存!
代码测试:
日志输出:
执行update,delete,insert 语句的时候,清空缓存 刷新缓存
因为在执行增删改的时候,必须使用sqlSession.commit()进行提交,这个提交会清空缓存
二级缓存:
mybatis 的二级缓存的作用域是一个mapper的namespace ,同一个namespace中查询sql可以从缓存中命中。二级缓存是跨session
- 二级缓存的开启:
需要在mapper.xml 中加入如下: 这个标签的位置应该和setting同级(在mapper标签内部)
进行跨session进行测试(关闭sqlSession.close())
代码如图:
在这里,需要将实体类序列化!
如图:
关闭二级缓存:
在全局的mybatis-config.xml 中去关闭二级缓存,如图,配置在setting当中
两者之间的区别:
- 作用域:
- 一级缓存:作用域是session
- 二级缓存:作用域是一个mapper的namespace,是可以跨session的
- 开启和关闭:
- 一级缓存:默认是开启的,并且我们无法管理一级缓存
- 二级缓存:开启需要在mapper.xml下写
<cache />
标签,关闭需要在全局的mybatis-config.xml内,配置setting标签name="cacheEnabled"
和value="flase"
!默认值为true,默认不关闭
- 清除缓存:
- 一级缓存:(1)可以使用sqlSession.clearCache()强制清除缓存!!(2)进行增删改的时候,调用commit方法,也会清空缓存
- 二级缓存:(1)需要设置statement配置中的flushCache="true"属性,就会增删改的时候,默认刷新缓存!!!(2)flushInterval(刷新间隔)可以被设置为任意的正整数。默认是不设置的,也就是没有刷新间隔!readOnly(只读)属性可以设置为true/false!!这里对二级缓存的刷新解释的不清晰,可以参考: