一级缓存
- 一级缓存默认启用,想要关闭一级缓存可以再select标签上配置flushCache = “true”
- 一级缓存存在于Sqlsession 的声明周期中,在同一个SqlSeesion中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中,如果同一个SqlSession中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中已经存在该键时,则会返回缓存中的对象
- 任何的insert,update,delete操作都会清空一级缓存
二级缓存
-
二级缓存以namespace为单位进行缓存,二级缓存默认开启,但是必须利用
<cache></cache>
标签才能开启单个namespace二级缓存 -
二级缓存有时会出现脏读情况,是因为不同的namespace中相同的查询所致,每当进行update,delete,insert操作时,会以namespace为单位清空缓存
当具有数据连接时,sqlSession会先访问二级缓存(如果二级缓存开启的情况下),如果二级缓存开启并其中具有相应缓存则返回,如果没有命中或二级缓存没有开启,则在一级缓存中找寻数据,如命中,直接返回,反之查询数据库
注意点:当mybatis与spring或者springboot结合时,在不开启事务的情况下,一级缓存也不会生效,只有当开启事务,或者方法具有事务注解时,才会启用一级缓存
原因:当mybaits与spring或springboot结合时,再不开启事务的情况下,每次执行sql语句都会启用新的session连接,一级缓存得是再同一次session中才会生效,故而一级缓存不会生效,但如果开启事务,则所有sql操作将会视为一次连接,同一次提交,所以会命中缓存