【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis,一级缓存失效

1.1、概述

MyBatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,Mybatis会将查询到的数据缓存起来(缓存到内存中), 第二次执行相同的查询时,会从缓存中取数据,不再进行数据库的查询,从而提高查询效率。默认情况下,Mybatis开启了一级缓存。但是MyBatis整合Spring Boot时,一级缓存却没有生效。

1.2、代码

java 复制代码
/**
 * 验证MyBatis的一级缓存默认是开启的
 */
@Test
public void getUserByIdTest() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	UserDO userDO1 = userMapper.getUserById(1L);
	System.out.println("userDO1 = " + userDO1);

	System.out.println("====================");

	UserDO userDO2 = userMapper.getUserById(1L);
	System.out.println("userDO2 = " + userDO2);
}

1.3、失效原因

当同一个线程开启事务时,同一个sql查询多次会走一级缓存,而不开启事务时,每一查询都是不同的sqlsession,即缓存为"失效"状态 。

1.4、解决

添加 @Transactional 注解。

java 复制代码
/**
 * 验证MyBatis的一级缓存默认是开启的
 */
@Transactional
@Test
public void getUserByIdTest() {
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	UserDO userDO1 = userMapper.getUserById(1L);
	System.out.println("userDO1 = " + userDO1);

	System.out.println("====================");

	UserDO userDO2 = userMapper.getUserById(1L);
	System.out.println("userDO2 = " + userDO2);
}
相关推荐
流星白龙2 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
码兄科技2 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
流星白龙5 小时前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存
豆瓣鸡10 小时前
Guava RateLimiter 限流实战:从令牌桶原理到 Nacos 动态配置
spring boot·微服务·nacos·guava
笑小枫11 小时前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
我不想名字重复11 小时前
redis缓存和数据库数据保持一致
数据库·redis·缓存
时空无限11 小时前
vllm 大模型启动缓存相关环境变量 export
linux·缓存·vllm
流星白龙13 小时前
【Redis】6.计数其他命令
数据库·redis·缓存
天若有情67313 小时前
SpringBoot4 + MyBatis 前后端分离实战|从零实现坏习惯管理系统,支持局域网手机访问CRUD
智能手机·mybatis
正儿八经的少年14 小时前
redis 的大 key 和热 key 详解
数据库·redis·缓存