MyBatis SqlSession 与缓存机制实例详解

 更新时间:2026年06月01日 10:06:41   作者:骄马之死  
Spring整合MyBatis中的SqlSession管理机制与缓存策略,详细解析了SqlSession绑定线程、事务的原理,以及一级、二级缓存的工作机制与配置方法,感兴趣的朋友跟随小编一起看看吧

一、Spring 管理下的 SqlSession 核心机制

Spring 会将 SqlSession当前线程事务进行强绑定,这是 MyBatis 整合 Spring 后最核心的运行机制,保证了事务一致性与线程安全。

1. 完整生命周期流程

  • 事务开启阶段
    • Spring 会检查当前线程是否已绑定 SqlSession,若不存在,则创建 SqlSession 并绑定到 ThreadLocal 中,实现线程隔离。
  • SQL 执行阶段
    • 所有 Mapper 接口都会通过当前线程绑定的 SqlSession 访问数据库,保证同一事务内使用同一个连接和会话。
  • 事务/请求结束阶段
    • Spring 事务管理器自动触发 closeSqlSession 逻辑
    • 清空 MyBatis 一级缓存
    • 释放数据库连接(Connection)并归还连接池
    • 解除绑定:将 SqlSession 从当前线程的 ThreadLocal 中移除

2. Mapper 调用底层原理(以userMapper.selectById(1)为例)

Mapper 接口本身没有实现类,底层是 JDK 动态代理对象,所有调用最终都会交给 SqlSession 执行。

核心代码示意

// 1. 获取 SqlSession
SqlSession session = sqlSessionFactory.openSession();
// 2. 通过 SqlSession 创建 Mapper 代理对象
UserMapper mapper = session.getMapper(UserMapper.class);
// 3. 本质:调用 SqlSession 的 selectOne 等方法
mapper.selectById(1);

3. Spring 整合后的详细执行流程

第一步:事务前置准备

Spring 事务拦截器 TransactionInterceptor 优先执行:

  1. 通过事务管理器 PlatformTransactionManager 获取数据库连接
  2. 将连接存入 TransactionSynchronizationManager(底层基于 ThreadLocal)
  3. 注意:此阶段仅准备数据库连接,SqlSession 尚未创建

第二步:执行 Mapper 方法(SqlSession 创建时机)

当代码执行到 userMapper.selectById(1) 时:

  1. 进入 Mapper 动态代理对象,调用 SqlSessionTemplate
  2. SqlSessionTemplate 委托 SqlSessionUtils 获取当前会话
  3. 复用/创建规则
    • 线程已有 SqlSession → 直接复用
    • 无线程会话 → 创建新 SqlSession,并绑定到当前 Spring 事务上下文

4. 非事务环境的问题

如果未开启 Spring 事务,执行逻辑会发生变化:

  • 每执行一个 Mapper 方法,Spring 都会创建一个临时 SqlSession
  • 方法执行完毕后立即关闭会话
  • 后果:一级缓存完全失效,多次相同查询会重复访问数据库,性能下降,且无法保证查询结果的数据一致性

二、MyBatis 一级缓存

核心定义

一级缓存是 SqlSession 级别的缓存,属于默认开启、无法关闭的本地缓存。

工作机制

同一个 SqlSession 内,执行完全相同的 SQL、参数时:

  1. 第一次查询 → 访问数据库,并将结果存入一级缓存
  2. 后续相同查询 → 直接从内存读取,不再请求数据库
  3. 会话提交/关闭/执行增删改操作 → 缓存自动清空

适用场景

单次请求、单次事务内的重复查询优化。

三、MyBatis 二级缓存

核心定义

二级缓存是 Mapper(Namespace)级别的缓存,跨 SqlSession 共享,多个线程/会话可以访问同一份缓存数据。

工作机制

  1. 当 SqlSession 提交或关闭时,会将一级缓存的数据同步到二级缓存
  2. 其他 SqlSession 执行相同 Mapper 的相同查询时,优先查询二级缓存
  3. 执行增删改操作 → 该 Namespace 下的二级缓存自动清空

开启方式

  • 全局配置(默认已开启)
  • mybatis-config.xml 中启用缓存开关:
  • <setting name="cacheEnabled" value="true"/>
  • Mapper 配置
  • 在对应的 Mapper.xml 文件中添加缓存标签:
  • <cache/>
  • 实体类要求
  • 缓存的 POJO 实体类必须实现 Serializable 序列化接口(二级缓存支持持久化到磁盘、Redis 等存储介质)。

总结

  1. SqlSession:由 Spring 托管,与线程、事务绑定,保证同一事务内会话唯一,非事务环境会导致会话频繁创建销毁、一级缓存失效。
  2. 一级缓存:SqlSession 级别,默认开启,会话内共享,会话关闭即清空。
  3. 二级缓存:Mapper 级别,跨会话共享,需手动开启,支持分布式/持久化存储,适用于读多写少的场景。

到此这篇关于MyBatis SqlSession 与缓存机制详解的文章就介绍到这了,更多相关MyBatis SqlSession 缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java通过URL获取公众号文章生成HTML的方法

    Java通过URL获取公众号文章生成HTML的方法

    这篇文章主要介绍了Java通过URL获取公众号文章生成HTML的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java结合Spark的数据清洗场景及对应的实现方法

    Java结合Spark的数据清洗场景及对应的实现方法

    在大数据处理中,数据清洗是非常重要的一步,数据清洗可以帮助我们去除脏数据、处理缺失值、规范数据格式等,以确保数据质量和准确性,在本文中,我们将介绍如何使用Java结合Spark框架来实现数据清洗,需要的朋友可以参考下
    2025-05-05
  • Java中对象序列化与反序列化详解

    Java中对象序列化与反序列化详解

    这篇文章主要介绍了Java中对象序列化与反序列化,较为详细的分析了java中对象序列化的概念、原理、实现方法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • kill命令在Java应用中使用的注意事项小结

    kill命令在Java应用中使用的注意事项小结

    这篇文章主要给大家介绍了关于kill命令在Java应用中使用的注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Java 实现图片压缩的两种方法

    Java 实现图片压缩的两种方法

    这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • Java对象类型转换实现方式(向上转型与向下转型)

    Java对象类型转换实现方式(向上转型与向下转型)

    文章介绍了Java中的类型转换、继承和对象类型转换的概念,以及向上转型和向下转型的实现方法和注意事项
    2026-02-02
  • SpringBoot2零基础到精通之异常处理与web原生组件注入

    SpringBoot2零基础到精通之异常处理与web原生组件注入

    SpringBoot是Spring全家桶的成员之一,基于约定优于配置的思想(即有约定默认值,在不配置的情况下会使用默认值,在配置文件下配置的话会使用配置的值)。SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架
    2022-03-03
  • SpringSecurity+Mysql数据库实现用户安全登录认证的实践

    SpringSecurity+Mysql数据库实现用户安全登录认证的实践

    Spring Security 是一个提供身份认证、授权和防范常见攻击的安全权限框架,本文主要介绍了SpringSecurity+Mysql数据库实现用户安全登录认证的实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Spring Boot拓展XML格式的请求和响应操作过程

    Spring Boot拓展XML格式的请求和响应操作过程

    在我们开发过程中,我们经常使用的参数绝大多少事HTML和JSON格式的请求和响应处理,但是我们在实际开发过程中,我们可能经历一些,比如对于XML格式的请求,本文给大家介绍Spring Boot拓展XML格式的请求和响应,感兴趣的朋友一起看看吧
    2023-10-10
  • SpringCloud Eureka 服务注册实现过程

    SpringCloud Eureka 服务注册实现过程

    这篇文章主要介绍了SpringCloud Eureka 服务注册实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论