mybatis的三级缓存

发布于:2024-07-01 ⋅ 阅读:(10) ⋅ 点赞:(0)
  1. 在Mybatis中,一级缓存指的是Session缓存,二级缓存指的是Mapper级的缓存,三级缓存则是全局的,对所有的Mapper有效的缓存

  2. 通过缓存,我们可以避免频繁地对数据库进行查询,从而提高应用程序的性能

  3. 一级缓存

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

    2. SqlSession session = factory.openSession();
      EmpolyeeMapper mapper = session.getMapper(EmpolyeeMapper.class);
      Empolyee empolyee1 = mapper.selectById(1);
      Empolyee empolyee2 = mapper.selectById(1);
      System.out.println(user1 == user2);
      
      
    3. 同一个SqlSession内,重复查询一次,发现并没有执行查询操作,返回的两个对象完全相同

  4. 二级缓存

    1. 二级缓存是Mapper级的缓存,默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,Mybatis要求返回的POJO必须是可序列化的

    2. 在mybatis-configuration.xml中加入配置,就会全局开启二级缓存

    3. <settings>
      	<setting name = "cacheEnabled" value = "true" />
      </settings>
      
      
    4. 或者在mapper.xml中添加此配置,Mybatis就会在这个namespace下启用二级缓存,这种缓存对于同一个namespace下的所有SqlSession都是有效的

    5. springboot配置开启二级缓存

      mybatis:
        mapper-locations: classpath:mapper/*.xml
        type-aliases-package: com.example.demo.entity
        configuration:
          cache-enabled: true
      
      
    6. 虽然可以通过新建两个SqlSession,但是由于启用了二级缓存,同一个mapper相同的查询只执行了一次

  5. 三级缓存

    1. 三级缓存是全局缓存,对所有的mapper都有效,Mybatis并未直接提供接口支持全局缓存,但是可以通过整合Encache,Redis等工具来实现,

    2. <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>
      
      
    3. 在Mybatis配置文件中进行相应的配置,需要配置encache的缓存管理

      <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      
      
  6. 通过mybatis的三级缓存,可以提高我们对数据库的查询效率,但是缓存可能会导致脏读,幻读等问题

  7. mybatis的一级缓存和二级缓存都不建议使用,他们只适合于单体项目。现在基本都是分布式或者微服务框架,使用的话会存在数据不一致问题