小工具知识网

当前位置: 首页 > 行业知识 > 【坑】Spring Boot整合MyBatis,一级缓存失效

行业知识

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

2026-10-29 18:30:43 来源:互联网转载

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

1.1、概述

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

1.2、代码

/** * 验证MyBatis的一级缓存默认是开启的 */@Testpublic 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 注解。

/** * 验证MyBatis的一级缓存默认是开启的 */@Transactional@Testpublic 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);}

 

上一篇:微邮付服务器怎么连接?

下一篇:接口协议揭秘,深入了解与运用实践