当前位置:   article > 正文

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

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

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

1.1、概述

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

1.2、代码

  1. /**
  2. * 验证MyBatis的一级缓存默认是开启的
  3. */
  4. @Test
  5. public void getUserByIdTest() {
  6. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  7. UserDO userDO1 = userMapper.getUserById(1L);
  8. System.out.println("userDO1 = " + userDO1);
  9. System.out.println("====================");
  10. UserDO userDO2 = userMapper.getUserById(1L);
  11. System.out.println("userDO2 = " + userDO2);
  12. }

1.3、失效原因

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

1.4、解决

        添加 @Transactional 注解。

  1. /**
  2. * 验证MyBatis的一级缓存默认是开启的
  3. */
  4. @Transactional
  5. @Test
  6. public void getUserByIdTest() {
  7. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  8. UserDO userDO1 = userMapper.getUserById(1L);
  9. System.out.println("userDO1 = " + userDO1);
  10. System.out.println("====================");
  11. UserDO userDO2 = userMapper.getUserById(1L);
  12. System.out.println("userDO2 = " + userDO2);
  13. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/139705?site
推荐阅读
相关标签
  

闽ICP备14008679号