由 Mybatis 源码畅谈软件设计(七):从根上理解 Mybatis 一级缓存

由 Mybatis 源码畅谈软件设计(七):从根上理解 Mybatis 一级缓存

💡 原文中文,约7100字,阅读约需17分钟。
📝

内容提要

本文讨论了MyBatis的一级缓存,重点介绍其实现原理、作用范围及失效机制。一级缓存基于SqlSession,不同SqlSession间不共享,主要用于减少重复查询,提高性能。执行插入、删除或更新操作会导致缓存失效,一级缓存存储对象引用,若修改对象,后续查询将返回修改后的数据,可能导致脏读。

🎯

关键要点

  • 一级缓存的生效范围是SqlSession级别,不同SqlSession间不共享缓存。
  • 一级缓存默认启用,主要用于减少同一查询SQL会话中的重复查询,提高性能。
  • 执行插入、删除或更新操作会导致一级缓存失效。
  • 一级缓存存储的是对象的引用,若对对象进行修改,后续查询将返回修改后的数据,可能导致脏读。
  • 一级缓存的实现依赖于BaseExecutor中的PerpetualCache,实际上是一个HashMap。

延伸问答

MyBatis的一级缓存是什么?

MyBatis的一级缓存是基于SqlSession的缓存,不同SqlSession间不共享,主要用于减少同一查询SQL会话中的重复查询,提高性能。

一级缓存的失效机制是什么?

执行插入、删除或更新操作会导致一级缓存失效,此外,当SqlSession关闭时,一级缓存也会被清空。

一级缓存存储的数据是什么类型?

一级缓存存储的是对象的引用,如果对对象进行修改,后续查询将返回修改后的数据,可能导致脏读。

如何清空MyBatis的一级缓存?

可以通过执行带有flushCache=true标签的SQL语句来清空一级缓存,或者调用sqlSession#clearCache方法。

一级缓存的生效范围是什么?

一级缓存的生效范围是SqlSession级别,不同SqlSession之间不共享缓存。

MyBatis的一级缓存是如何实现的?

一级缓存的实现依赖于BaseExecutor中的PerpetualCache,实际上是一个HashMap。

➡️

继续阅读