记一次Mybatis缓存踩坑

接口结果和预期的不一致,在本地Debug,便有了以上的截图

  • 为啥按id查出来的对象id为空?
  • 为啥sql打印的结果 templateType为1,对象里确是 0?

一脸懵逼🤔️

原来,同一个查询,查了会缓存,后面直接命中了缓存,不再查数据库

一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。

对返回对象的修改,同时也是对缓存的对象的修改😂

  • MyBatis一级缓存的生命周期和SqlSession一致。
  • MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起数据脏读。
  • 每次执行update前会清空localCache。

对Mybatis缓存的分析,有兴趣的可以看看这篇文章

聊聊MyBatis缓存机制

十三❤Chinese❤cycling❤Lamborghini❤∃

Leave a Reply

Your email address will not be published.