Mybatis 调用过程解读

  • 每次与数据库的连接都会优先走缓存中查找
  • 查询流程:先查询二级缓存,没有命中再去查询一级缓存,都没有命中才会去查询数据库
  • 写入流程:既然查询的时候是走二级缓存,再走一级缓存,所以在查询数据库后,开始要写入缓存了,就会先在一级缓存中写入,等待SqlSession.close()后,再去写入二级缓存!
  • 一级缓存是SqlSession缓存是独享的,默认开启,建议开启
  • 二级缓存是以配置文件 <namespace>为单位的开启的,是在多个SqlSession 共享的,容易出现赃读、脏写,不建议使用!!!

什么是Mybatis一级缓存(本地缓存)?(默认开启)

Mybatis一级缓存是本地缓存:SqlSession

当我们连续通过Mybatis 查询同一条Sql的时候两次,在短时间内,只会在第一次查询时会走SQL,查询出结果,第二次或短期内多次查询,就不会出现连接数据库(Opening JDBC Connection)查询!后续查出的结果是一级缓存的内容!

仅仅在一个SqlSession中有效!

测试一级缓存

  • 配置Mybatis日志,不配置看不到日志,无法判定
  • 单元测试,调用Mybatis 执行多次SQL,然后关闭SqlSession
  • 观察日志,是否只有一条SQL执行的打印

一级缓存失效问题

  1. 只在一个SqlSession中有效,多个SqlSession中无效
  2. 同一个SqlSession中,查询条件不一样 比如第一次查询id=1的用户。第二次查询id=2的用户,就会失效
  3. 同一个SqlSession中,触发 Insert、Update、Delete 会失效。这点很正常,不然数据库都变了,还从缓存拿,肯定不行
  4. 同一个SqlSession中,手动清除缓存 sqlSession.clearCache()

Mybatis 默认清除策略是LRU (Leaset Recently Used)最少使用原则

什么是Mybatis二级缓存(全局缓存)?(默认不开启,需要手动开启)

第一步确保缓存数据实体Pojo,必须序列化了

如何在某一个namespaces全局开启呢?

在整体开启全局缓存,最好先显示配置一下开启二级缓存

然后在某一个mapper.xml 添加<catch> </catch>即可,中间不需要填内容

缓存陷井?

发表评论

您的电子邮箱地址不会被公开。