【坑】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);
}
相关推荐
千寻技术帮12 小时前
10361_基于Springboot的哈尔滨旅游管理系统
数据库·spring boot·mysql·毕业设计·旅游
步菲13 小时前
springboot canche 无法避免Null key错误, Null key returned for cache operation
java·开发语言·spring boot
毕设源码-朱学姐13 小时前
【开题答辩全过程】以 基于SpringBoot的中医理疗就诊系统为例,包含答辩的问题和答案
java·spring boot·后端
Coder_Boy_18 小时前
SpringAI与LangChain4j的智能应用-(理论篇2)
人工智能·spring boot·langchain·springai
Coder_Boy_19 小时前
SpringAI与LangChain4j的智能应用-(理论篇3)
java·人工智能·spring boot·langchain
武昌库里写JAVA20 小时前
iview-CRUD模板
vue.js·spring boot·sql·layui·课程设计
楼兰胡杨21 小时前
Spring Boot整合Sentinel之QPS限流
spring boot
侠客行031721 小时前
Mybatis入门到精通 一
java·mybatis·源码阅读
Coder_Boy_21 小时前
基于SpringAI的智能平台基座开发-(四)
java·人工智能·spring boot·langchain·springai
码界奇点1 天前
基于Spring Boot的内容管理系统框架设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理