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
-

最低0.47元/天 解锁文章
1313

被折叠的 条评论
为什么被折叠?



