缓存在我们系统中是一个不可避免的话题技术,缓存究竟给我们带来哪些好处呢?最直观的是我可以通过缓存获取查询数据而不用链接 数据库进行查询,这样减少空间资源占用同时提高我们的效率。那么mybatis框架的一级及二级缓存怎样使用呢?
首先我们要明白好的框架具有灵活性,所以我们使用缓存要知道怎么灵活使用。
1)一级缓存
首先一级缓存是我们小范围的缓存也就是sqlsession级别的缓存,不同sqlsession操作数据时进行缓存数据获取。在我们框架中默认支持一级缓存。通过代码跟踪测试可知:
测试类如下:
由以上测试可知:一级缓存我们如果查询到目标数据时再次查询时可以看到并没有进行数据库链接查询,同时如果进行了修改数据操作那么mybatis会清除一级缓存来保证数据正确性。其原理为查询我们为10的用户信息通过调用defaultsqlsession中selectone接口,调用executor中query接口,可以通过debugger可知数据结构为一个hashmap:我们查询操作会生成一特定规则的key(hashcde+statement的id+sql+入参),如果第二次进行查询会从localcash中查询,如果存在key则直接从缓存中获取而不用createdatabase,源码如下图:
2)二级缓存
我们需要手动设置二级缓存,在我们全局配置文件中配置二级缓存
缓存范围是跨SqlSession的,范围是mapper的namespace,相同的namespace使用一个二级缓存结构。
需要进行参数配置让mybatis支持二级缓存。
然后在mapper配置中,配置<cache />
同时我们的pojo类要实现序列化
注意:将查询结果的pojo对象进行序列化实现 java.io.Serializable接口
如何清除缓存
执行相同的statement,如果执行提交操作需要清除二级缓存,
如果想让statement执行后刷新缓存(清除缓存),在statement中设置flushCache="true" (默认值 是true)
设置statement是否开启二级缓存,如果让某个statement启用二级缓存,设置useCache=true(默认值为true)
有上述测试可以看到红色标注,如果开启二级缓存时,再次不同sqlseesion中查询,如果命中率不为0则看出从缓存中获取,原理与一级缓存相似,查询时首先从配置文件中获取是否开启cache二级缓存,如果开启则进入二级缓存中,源代码如下:
修改statement的useCache为false,表示该statement不再进行二级缓存
总结:
如果二缓存开启,首先从二级缓存查询数据,如果二级缓存有则从二级缓存中获取数据,如果二级缓存没有,从一级缓存找是否有缓存数据,如果一级缓存没有,查询数据库。