Mybatis缓存概述
MyBatis是一种Java持久性框架,具备内置的缓存机制,用于提高数据库操作的性能。
MyBatis的缓存主要分为:一级缓存(Local Cache)和二级缓存(Second-Level Cache)。
如下图所示:
缓存可以存储查询结果,以便在后续相同查询的情况下避免数据库查询,从而提高性能。
Mybatis一级缓存
一级缓存是MyBatis的默认缓存,它是在会话(Session)级别的缓存,也就是在一个数据库会话期间有效。
当查询数据时,查询结果会被缓存在一级缓存中,如果再次查询相同的数据,MyBatis会首先检查一级缓存。
如下图所示:
一级缓存的范围是在同一个SqlSession内,不同SqlSession之间不共享缓存。
如下所示:
SqlSession sqlSession = sqlSessionFactory.openSession(); User user1 = sqlSession.selectOne("getUserById", 1); // 查询数据库 User user2 = sqlSession.selectOne("getUserById", 1); // 从一级缓存中获取,而不再查询数据库
如果数据已存在,则直接返回缓存中的数据,而不再查询数据库。
Mybatis二级缓存
二级缓存是在不同SqlSession之间共享的缓存,通常存储在应用程序的内存中。
二级缓存需要在MyBatis的配置文件中显式启用,并可以配置缓存的实现方式。
如下所示:
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
二级缓存对于多个会话之间频繁查询相同数据非常有效,可以减少数据库查询次数。
二级缓存的使用范围是Mappers(映射器),需要在Mappers上进行配置。
如下所示:
<!-- 在MyBatis配置文件中启用二级缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 在Mapper XML 中配置使用二级缓存 --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
MyBatis的缓存机制是可配置的,你可以根据具体需求来选择是否启用、如何配置和管理缓存。
一级和二级缓存区别
1. 范围和生命周期的区别
- 一级缓存:一级缓存是会话级的,只在同一个SqlSession内有效。
- 二级缓存:二级缓存是应用程序级的,可以在不同SqlSession之间共享。
2. 使用场景的区别
- 一级缓存:适用于同一个SqlSession内频繁查询相同数据的情况,可以减少数据库查询次数,一级缓存在单个SqlSession内有效。
- 二级缓存:适用于多个SqlSession之间需要共享相同数据的情况,二级缓存适用于需要长期或跨会话的数据共享和重用。
3. 配置的区别
- 一级缓存:MyBatis默认开启一级缓存,无需额外配置。
- 二级缓存:二级缓存需要在MyBatis的配置文件中显式启用,并可以配置缓存的实现方式,如EhCache、Redis等。
4. 数据共享的区别
- 一级缓存:不同SqlSession之间不共享一级缓存,每个SqlSession拥有独立的一级缓存,不能实现数据的跨会话共享。
- 二级缓存:不同SqlSession之间可以共享二级缓存中的数据,实现了数据的跨会话共享。
5. 维护数据一致性的区别
- 一级缓存:对于数据的一致性维护较为简单,因为它只在一个SqlSession内有效,不需要考虑不同会话之间的数据同步问题。
- 二级缓存:需要考虑数据的一致性维护,因为不同SqlSession之间共享二级缓存。
在使用MyBatis时,开发者可以根据具体需求和数据访问模式选择使用一级缓存、二级缓存,或两者同时使用,以获得最佳性能和数据一致性。
Mybatis缓存总结
MyBatis提供一级缓存和二级缓存,用于提高数据库访问性能。
一级缓存在SqlSession生命周期内有效,对于同一个SqlSession内的查询非常有效。
二级缓存用于不同SqlSession之间的共享,需要在MyBatis配置中显式启用,并在Mapper接口或XML中配置。
缓存的使用需要谨慎,因为它可能导致数据不一致问题,特别是在写操作后需要及时清除缓存。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》