Mybatis 调用过程解读
- 每次与数据库的连接都会优先走缓存中查找!
- 查询流程:先查询二级缓存,没有命中再去查询一级缓存,都没有命中才会去查询数据库
- 写入流程:既然查询的时候是走二级缓存,再走一级缓存,所以在查询数据库后,开始要写入缓存了,就会先在一级缓存中写入,等待SqlSession.close()后,再去写入二级缓存!
- 一级缓存是SqlSession缓存是独享的,默认开启,建议开启
- 二级缓存是以配置文件 <namespace>为单位的开启的,是在多个SqlSession 共享的,容易出现赃读、脏写,不建议使用!!!
什么是Mybatis一级缓存(本地缓存)?(默认开启)
Mybatis一级缓存是本地缓存:SqlSession
当我们连续通过Mybatis 查询同一条Sql的时候两次,在短时间内,只会在第一次查询时会走SQL,查询出结果,第二次或短期内多次查询,就不会出现连接数据库(Opening JDBC Connection)查询!后续查出的结果是一级缓存的内容!
仅仅在一个SqlSession中有效!
测试一级缓存
- 配置Mybatis日志,不配置看不到日志,无法判定
- 单元测试,调用Mybatis 执行多次SQL,然后关闭SqlSession
- 观察日志,是否只有一条SQL执行的打印
一级缓存失效问题
- 只在一个SqlSession中有效,多个SqlSession中无效
- 同一个SqlSession中,查询条件不一样 比如第一次查询id=1的用户。第二次查询id=2的用户,就会失效
- 同一个SqlSession中,触发 Insert、Update、Delete 会失效。这点很正常,不然数据库都变了,还从缓存拿,肯定不行
- 同一个SqlSession中,手动清除缓存 sqlSession.clearCache()
Mybatis 默认清除策略是LRU (Leaset Recently Used)最少使用原则
什么是Mybatis二级缓存(全局缓存)?(默认不开启,需要手动开启)
第一步确保缓存数据实体Pojo,必须序列化了
如何在某一个namespaces全局开启呢?
在整体开启全局缓存,最好先显示配置一下开启二级缓存
然后在某一个mapper.xml 添加<catch> </catch>即可,中间不需要填内容
缓存陷井?
特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤
评论(0)