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

💡 原文中文,约15900字,阅读约需38分钟。
📝

内容提要

二级缓存基于Mapper级别,支持多个SqlSession共享。通过配置cache标签启用,readOnly属性默认为false,表示缓存对象为深拷贝。二级缓存在事务提交后生效,以避免脏数据问题。增删改操作会使缓存失效,旨在提高数据库访问效率。

🎯

关键要点

  • 二级缓存基于Mapper级别,支持多个SqlSession共享。

  • 通过配置cache标签启用,readOnly属性默认为false,表示缓存对象为深拷贝。

  • 二级缓存在事务提交后生效,以避免脏数据问题。

  • 增删改操作会使缓存失效,旨在提高数据库访问效率。

  • 二级缓存的序列化机制与一级缓存不同,避免了对对象引用的直接修改。

  • 二级缓存的实现类默认是PerpetualCache,缓存回收策略为LRU。

  • 二级缓存的创建和管理涉及多个类和装饰器模式。

  • 事务提交时,二级缓存才会被保存,未提交的事务不会影响缓存。

  • 二级缓存的设计目的是为了提高数据库访问效率,特别是在读多写少的场景。

  • 二级缓存的引入需要更复杂的缓存失效策略和数据一致性管理。

🔎

延伸解读

二级缓存的设计目的

MyBatis 的二级缓存设计旨在提高数据库访问效率,特别适用于读多写少的场景。通过在多个 SqlSession 之间共享缓存,能够有效减少数据库的访问次数,从而提升应用性能。

缓存失效机制

二级缓存的失效机制相对复杂,增删改操作会导致缓存失效,以确保数据一致性。此外,事务未提交时,二级缓存不会生效,以避免脏数据问题。这一设计需要开发者在使用时特别注意数据的一致性管理。

readOnly 属性的影响

二级缓存的 readOnly 属性默认为 false,表示缓存对象为深拷贝。若设置为 true,则返回对象引用,避免深拷贝开销,但可能导致数据不一致。因此,选择合适的配置需根据具体业务场景进行权衡。

延伸问答

Mybatis的二级缓存是如何工作的?

Mybatis的二级缓存基于Mapper级别,支持多个SqlSession共享,只有在事务提交后才会生效,以避免脏数据问题。

如何在Mybatis中启用二级缓存?

在Mapper.xml文件中通过配置<cache />标签来启用二级缓存。

二级缓存的readOnly属性有什么作用?

readOnly属性默认为false,表示缓存对象为深拷贝,修改缓存不会影响后续查询结果。如果设置为true,则返回对象引用,避免深拷贝开销。

为什么二级缓存需要在事务提交后才能生效?

因为二级缓存可以在不同SqlSession间共享,如果在事务未提交时生效,可能导致其他会话获取到脏数据。

二级缓存的清除策略是怎样的?

执行增、删、改操作会使当前Mapper下的二级缓存失效,确保数据一致性。

Mybatis的二级缓存与一级缓存有什么区别?

一级缓存是基于SqlSession的,作用范围仅限于一次数据库会话;而二级缓存是基于Mapper级别的,可以在多个SqlSession之间共享。

🏷️

标签

➡️

继续阅读