MyBatis的三级缓存

本文详细介绍了MyBatis的三级缓存机制,包括一级缓存、二级缓存和全局的三级缓存。讲解了如何开启和使用二级缓存,并提到了如何通过整合Ehcache和Redis实现全局缓存。同时,文章也讨论了缓存可能带来的问题和在分布式环境中的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis的三级缓存

一、什么是MyBatis的三级缓存?

MyBatis的三级缓存指的是一级缓存、二级缓存和三级缓存。

缓存是一种提高数据读取性能的技术,在MyBatis中,一级缓存指的是Session缓存,二级缓存指的是Mapper级的缓存,三级缓存则是全局的,对所有的mapper有效的缓存。

通过缓存,我们可以避免频繁地对数据库进行查询,从而提高应用程序的性能。
MyBatis的三级缓存示意图

二、一级缓存

一级缓存是MyBatis的核心缓存,是SqlSession级别的,这意味着只要在同一个SqlSession中,相同的查询就会从缓存中取得结果。

看下面的示例代码:

SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectById(1);
User user2 = mapper.selectById(1);
System.out.println(user1 == user2);

同一个SqlSession内,重复查询一次,发现并没有执行查询操作,返回的两个对象完全相同。

三、二级缓存

二级缓存是Mapper级的缓存,默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。
在mybatis-configuration.xml 加入配置,就会全局开启二级缓存

<settings>
	<setting name = "cacheEnabled" value = "true" />
</settings>

或者在mapper.xml中添加此配置,MyBatis就会在这个namespace下启用二级缓存。这种缓存对于同一个namespace下的所有SqlSession都是有效的。

<cache/>

springboot配置开启二级缓存

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    cache-enabled: true

二级缓存的测试代码如下:

SqlSession session1 = factory.openSession();
UserMapper mapper1 = session1.getMapper(UserMapper.class);
User user1 = mapper1.selectById(1);
session1.close();

SqlSession session2 = factory.openSession();
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user2 = mapper2.selectById(1);
session2.close();

System.out.println(user1 == user2);

可以看到,虽然是两个SqlSession,但是由于启用了二级缓存,所以相同的查询只执行了一次。

四、三级缓存

三级缓存是全局缓存,对所有的mapper都有效。MyBatis并未直接提供接口支持全局缓存,但是可以通过整合Ehcache,Redis等工具来实现。比如下面这样接入ehcache。
首先,我们需要在项目的配置文件中引入相关的依赖。在Maven项目中,我们可以使用以下代码来引入依赖:

<dependency>
	<groupId>org.mybatis.caches</groupId>
	<artifactId>mybatis-ehcache</artifactId>
	<version>1.2.1</version>
</dependency>
<dependency>
	<groupId>org.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>3.8.1</version>
</dependency>

然后,我们需要在Mybatis的配置文件中进行相关的配置。需要配置ehcache的缓存管理器:

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

大致流程如此。

总结

通过MyBatis的三级缓存,可以大大提高我们对数据库的查询效率,但是也需要注意,缓存也可能会导致脏读、幻读等问题,这些都需要在实际开发中去考虑和权衡。

MyBatis 的一级缓存 二级缓存 都不建议使用,它们只适用于单体项目,现在基本都是分布式或者微服务框架,使用的话会存在数据不一致问题。
在我开发这几年,用的都是微服务架构。也没用过Mybatis的缓存,主要是它也不够灵活,都是手动在代码中做的redis缓存。手动在代码中做redis缓存我觉得更灵活可控。

MyBatis框架中的缓存机制是通过三级缓存来实现的。三级缓存包括一级缓存、二级缓存三级缓存。 1. 一级缓存:也称为本地缓存,它是SqlSession级别的缓存。当执行查询操作时,查询结果会被缓存在SqlSession对象中,如果再次执行相同的查询,MyBatis会先检查一级缓存中是否存在相同的查询结果,如果存在则直接返回缓存中的结果,避免了再次查询数据库的开销。一级缓存默认是开启的,可以通过手动清空来刷新缓存。 2. 二级缓存:也称为全局缓存,它是Mapper级别的缓存。当SqlSession执行查询时,查询结果会被缓存在一个共享的二级缓存区域中,不同的SqlSession可以共享同一个二级缓存。当其他SqlSession执行相同的查询时,会先从二级缓存中查找是否存在相同的结果,如果存在则直接返回缓存中的结果。二级缓存默认是关闭的,需要手动配置开启。 3. 三级缓存:也称为分布式缓存,它是跨SqlSessionFactory的缓存MyBatis框架中默认没有实现三级缓存,但可以通过集成其他第三方缓存框架实现。通过将二级缓存的数据序列化到外部缓存中,使得不同的SqlSessionFactory可以共享同一份缓存数据,从而提高缓存的利用率。 需要注意的是,缓存是一个可选的特性,它可以提高查询性能,但也会带来一致性的问题。在使用缓存时,需要根据具体业务场景和数据更新频率来进行合理的配置和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java劝退师、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值