Mybatis 缓存机制

序言

本文和大家聊聊 Mybatis 缓存。

一、本地缓存

Mybatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 默认情况下,只启用了本地的会话缓存(又称一级缓存),它仅仅对一个会话中的数据进行缓存。

在 Mybatis 中,一级缓存是基于 SqlSession 的。每个新的 SqlSession 都有自己的一级缓存,这个缓存只对当前的 SqlSession 可见。当 SqlSession 提交或关闭后,它的一级缓存也会清空。

在同一个 SqlSession 中,相同的查询会被缓存,所以如果在同一个 SqlSession(也就是同一个事务中)执行相同的查询两次,第二次查询会直接从缓存中获取结果,而不会去数据库中查询。

@SpringBootTest
public class AppTest {

    @Resource
    private UserMapper userMapper;

    @Test
    @Transactional
    public void test() {
        List<User> user1 = userMapper.getAll();
        List<User> user2 = userMapper.getAll();

        user1.forEach(System.out::println);
        System.out.println("===============");
        user2.forEach(System.out::println);
    }
}

以上面的查询为例,在一个事务中调用 userMapper.getAll() 两次,我们会发现如下结果:

image.png

二、全局缓存

在 Mybatis 中,二级缓存也被称为全局缓存或者 Mapper 级别的缓存。二级缓存的作用范围是整个 namespace,可以被多个 SqlSession 共享。二级缓存的主要目的是解决一级缓存不能跨会话共享的问题

默认情况下,Mybatis 只启用了本地的会话缓存,要启用全局的二级缓存,需要在 SQL 映射文件中添加一行:

<cache/>

当开启了二级缓存之后,多次查询会发现:第一次若二级缓存未命中,会执行查询数据库,接下来的查询会命中二级缓存。

image.png

在二级缓存中:

  1. 映射语句文件中的所有 select 语句的结果将会被缓存。
  2. 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  3. 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  4. 缓存不会定时进行刷新(也就是说,没有刷新间隔)

三、缓存的工作流程

workspace (1).png

Mybatis 缓存的工作流程如下:

  1. 首先,MyBatis 会检查二级缓存中是否有对应的结果。如果二级缓存中有对应的结果,MyBatis 就会直接返回这个结果。
  2. 如果二级缓存中没有对应的结果,MyBatis 会继续检查一级缓存。如果一级缓存中有对应的结果,MyBatis 就会直接返回这个结果,而不会去查询数据库。
  3. 如果一级缓存和二级缓存中都没有对应的结果,MyBatis 就会去数据库中查询。

往期推荐

  1. 为什么 MySQL 单表数据量最好别超过 2000w
  2. ConcurrentHashMap 源码分析(一)
  3. IoC 思想简单而深邃
  4. ThreadLocal
  5. JDK 动态代理

相关推荐

  1. Mybatis缓存机制

    2024-04-25 09:04:02       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 09:04:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 09:04:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 09:04:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 09:04:02       20 阅读

热门阅读

  1. Apollo 9.0 aem;buildtool

    2024-04-25 09:04:02       14 阅读
  2. 标定系列——OpenCV中CV_16S的常用场合(二十六)

    2024-04-25 09:04:02       15 阅读
  3. js音频指定扬声器

    2024-04-25 09:04:02       13 阅读
  4. 构建数据驱动的文化价值体系,还得靠数据分析

    2024-04-25 09:04:02       17 阅读
  5. 每天一个数据分析题(二百九十)

    2024-04-25 09:04:02       14 阅读
  6. React的Key和diff

    2024-04-25 09:04:02       12 阅读
  7. 掌握Midjourney视觉艺术的关键提示词指南

    2024-04-25 09:04:02       15 阅读
  8. windows ubuntu sed,awk,grep篇:2:sed 替换命令

    2024-04-25 09:04:02       12 阅读
  9. 机器学习之sklearn基础教程

    2024-04-25 09:04:02       12 阅读