Mybatis缓存详解(万字图文)

Mybatis缓存详解(万字图文)-mikechen

Mybatis缓存概述

MyBatis是一种Java持久性框架,具备内置的缓存机制,用于提高数据库操作的性能。

MyBatis的缓存主要分为:一级缓存(Local Cache)和二级缓存(Second-Level Cache)。

如下图所示:

Mybatis缓存详解(万字图文)-mikechen

缓存可以存储查询结果,以便在后续相同查询的情况下避免数据库查询,从而提高性能。

 

Mybatis一级缓存

一级缓存是MyBatis的默认缓存,它是在会话(Session)级别的缓存,也就是在一个数据库会话期间有效。

当查询数据时,查询结果会被缓存在一级缓存中,如果再次查询相同的数据,MyBatis会首先检查一级缓存。

如下图所示:

Mybatis缓存详解(万字图文)-mikechen

一级缓存的范围是在同一个SqlSession内,不同SqlSession之间不共享缓存。

如下所示:

SqlSession sqlSession = sqlSessionFactory.openSession();
User user1 = sqlSession.selectOne("getUserById", 1); // 查询数据库
User user2 = sqlSession.selectOne("getUserById", 1); // 从一级缓存中获取,而不再查询数据库

如果数据已存在,则直接返回缓存中的数据,而不再查询数据库。

 

Mybatis二级缓存

二级缓存是在不同SqlSession之间共享的缓存,通常存储在应用程序的内存中。

二级缓存需要在MyBatis的配置文件中显式启用,并可以配置缓存的实现方式。

如下所示:

Mybatis缓存详解(万字图文)-mikechen

当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

二级缓存对于多个会话之间频繁查询相同数据非常有效,可以减少数据库查询次数。

二级缓存的使用范围是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面试题总结

评论交流
    说说你的看法