由 Mybatis 源码畅谈软件设计(八):从根上理解 Mybatis 二级缓存
💡
原文中文,约15900字,阅读约需38分钟。
📝
内容提要
二级缓存基于Mapper级别,支持多个SqlSession共享。通过配置cache标签启用,readOnly属性默认为false,表示缓存对象为深拷贝。二级缓存在事务提交后生效,以避免脏数据问题。增删改操作会使缓存失效,旨在提高数据库访问效率。
🎯
关键要点
- 二级缓存基于Mapper级别,支持多个SqlSession共享。
- 通过配置cache标签启用,readOnly属性默认为false,表示缓存对象为深拷贝。
- 二级缓存在事务提交后生效,以避免脏数据问题。
- 增删改操作会使缓存失效,旨在提高数据库访问效率。
- 二级缓存的序列化机制与一级缓存不同,避免了对对象引用的直接修改。
- 二级缓存的实现类默认是PerpetualCache,缓存回收策略为LRU。
- 二级缓存的创建和管理涉及多个类和装饰器模式。
- 事务提交时,二级缓存才会被保存,未提交的事务不会影响缓存。
- 二级缓存的设计目的是为了提高数据库访问效率,特别是在读多写少的场景。
- 二级缓存的引入需要更复杂的缓存失效策略和数据一致性管理。
❓
延伸问答
Mybatis的二级缓存是如何工作的?
Mybatis的二级缓存基于Mapper级别,支持多个SqlSession共享,只有在事务提交后才会生效,以避免脏数据问题。
如何在Mybatis中启用二级缓存?
在Mapper.xml文件中通过配置<cache />标签来启用二级缓存。
二级缓存的readOnly属性有什么作用?
readOnly属性默认为false,表示缓存对象为深拷贝,修改缓存不会影响后续查询结果。如果设置为true,则返回对象引用,避免深拷贝开销。
为什么二级缓存需要在事务提交后才能生效?
因为二级缓存可以在不同SqlSession间共享,如果在事务未提交时生效,可能导致其他会话获取到脏数据。
二级缓存的清除策略是怎样的?
执行增、删、改操作会使当前Mapper下的二级缓存失效,确保数据一致性。
Mybatis的二级缓存与一级缓存有什么区别?
一级缓存是基于SqlSession的,作用范围仅限于一次数据库会话;而二级缓存是基于Mapper级别的,可以在多个SqlSession之间共享。
➡️