MyBatis的三级缓存

向右看齐 2023-10-14 13:25 31阅读 0赞

MyBatis的三级缓存

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

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

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

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

二、一级缓存

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

看下面的示例代码:

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

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

三、二级缓存

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

  1. <settings>
  2. <setting name = "cacheEnabled" value = "true" />
  3. </settings>

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

  1. <cache/>

springboot配置开启二级缓存

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

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

  1. SqlSession session1 = factory.openSession();
  2. UserMapper mapper1 = session1.getMapper(UserMapper.class);
  3. User user1 = mapper1.selectById(1);
  4. session1.close();
  5. SqlSession session2 = factory.openSession();
  6. UserMapper mapper2 = session2.getMapper(UserMapper.class);
  7. User user2 = mapper2.selectById(1);
  8. session2.close();
  9. System.out.println(user1 == user2);

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

四、三级缓存

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

  1. <dependency>
  2. <groupId>org.mybatis.caches</groupId>
  3. <artifactId>mybatis-ehcache</artifactId>
  4. <version>1.2.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.ehcache</groupId>
  8. <artifactId>ehcache</artifactId>
  9. <version>3.8.1</version>
  10. </dependency>

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

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

大致流程如此。

总结

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

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

发表评论

表情:
评论列表 (有 0 条评论,31人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java 三级缓存

    就是把访问量较高的热点数据从传统的关系型数据库中加载到内存中,当用户再次访问热点数据时是从内存中加载,减少了对数据库的访问量,解决了高并发场景下容易造成数据库宕机的问题。

    相关 MyBatis三级缓存

    MyBatis的三级缓存 一、什么是MyBatis的三级缓存? MyBatis的三级缓存指的是一级缓存、二级缓存和三级缓存。 缓存是一种提高数据读取性能的技术,在

    相关 Android 图片三级缓存

    在Android开发中,我们经常会使用到网络图片资源,而为了避免频繁的访问网络获取图片资源,我们一般会将网络图片缓存到本地或者内存中以方便使用,这就需要使用到图片的三级缓存:

    相关 图片三级缓存

    图片的三级缓存:内存,(本地)sd卡,网络,避免大图片造成oom(out of memory) 内存缓存也就是在程序维护键值对保存图片信息,程序退出后就不再存在 不管and