MyBatis缓存开发教程:从原理到实战

MyBatis的缓存机制是提升数据库访问性能的核心工具,通过减少重复SQL查询降低数据库压力。本文将系统讲解一级缓存(SqlSession级别)二级缓存(Mapper级别)的原理、配置及实战技巧,并结合Redis分布式缓存解决跨节点一致性问题。

一、核心概念与工作原理

1. 一级缓存(Local Cache)

  • 作用域:同一个SqlSession内有效(默认开启)。

  • 工作原理

    SqlSession执行查询时,首次从数据库获取数据,会将结果存储在HashMap中(键为SQL ID + 参数 + 分页信息);后续相同查询直接从缓存读取,无需访问数据库。

  • 生命周期:随SqlSession关闭或提交(commit()/rollback())而清空。

  • 特点

    • 自动维护,无需额外配置;

    • 仅适用于单会话内的重复查询(如一次请求中的多次查询);

    • 增删改操作会自动清空缓存(避免脏读)。

示例

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 首次查询:访问数据库,结果存入一级缓存
    User user1 = mapper.selectById(1L); 
    // 二次查询:直接从一级缓存读取,不访问数据库
    User user2 = mapper.selectById(1L); 
    System.out.println(user1 == user2); // 输出true(同一对象实例)
}

2. 二级缓存(Global Cache)

  • 作用域:同一个Mapper(命名空间)内有效(需手动开启)。

  • 工作原理

    SqlSession关闭或提交时,一级缓存的数据会同步到二级缓存(Mapper级别的共享缓存);其他SqlSession执行相同查询时,先从二级缓存读取,未命中再查数据库。

  • 生命周期:随SqlSessionFactory创建而初始化,默认一直存在(除非手动清空或配置过期策略)。

  • 特点

    • 需在Mapper.xml中添加<cache/>标签开启;

    • 支持SqlSe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值