一篇读懂–mybatis的缓存

MyBatis的缓存指的是缓存查询结果,当以后使用相同的sql语句、传入相同的参数进行查询时,可直接从mybatis本地缓存中获取查询结果,而不必查询数据库。

mybatis的缓存包括一级缓存、二级缓存,一级缓存默认是开启的,二级缓存默认是关闭的。

一级缓存:

SqlSession级别:在SqlSession中有一个Map,key是由sql语句、参数等信息组成的唯一值,value是查询出来的结果对象。
好处: 减小数据库压力
如何失效 :只要此sqlSession调用了、、这些会修改数据库的元素,就会清空此sqlSession的一级缓存,不管有没有使用commit()提交。
举例:

        User user1 = mapper.queryUserById(1);User user2 = mapper.queryUserById(1);

第一次查询时,就将查询结果放到一级缓存中。
如果后续使用的sql语句相同、传入的实参也相同,则结果对象也会相同,直接从一级缓存中获取结果对象,不再查询数据库。

        User user1 = mapper.queryUserById(1);sqlSession.commit();User user2 = mapper.queryUserById(1);

如果此sqlSession调用了commit()方法,会自动清空此sqlSession的一级缓存。
因为使用commit(),会将修改提交到数据库,下一次相同的查询,查询结果可能变了,之前的一级缓存不能再用,所以会自动清空。

下面用spring整合mybatis来测试一下mybatis的一级缓存:
1、下面是service层实现, 可以看到,我两次查询了同一个数据,理论上由于mybatis中默认开启一级缓存, 那么第二次肯定时要从缓存中获取,而不是创建SqlSession对象重新从数据库获取:

@Autowired
private LsjmUserMapper lsjmUserMapper;@Override
public LsjmUser getUser() {// 第一次查询LsjmUser user = lsjmUserMapper.getUserByName("300");System.out.println(user.toString());// 第二次查询LsjmUser user1 = lsjmUserMapper.getUserByName("300");System.out.println(user1.toString());return user;
}

从日志信息可以很明显的看到,代码中的两次查询构建了两个SqlSession对象,也就是说第二次查询并没有从前一次的SqlSession缓存中获取,而是自己新建一个SQLSession对象,重新查询;这样看来,一级缓存好像失效了?

这是为什么呢?因为我们没有加@Transaction注解
spring 中 结合 mybatis中,默认情况下,数据库处于自动提交模式,每一条sql语句处于一个单独的事务中,语句执行完毕时,如果执行成功则隐式提交事务。而mybatis的一级缓存在这种情况下是无效的,想要一级缓存起作用,则要开启事务:

开启事务: spring使用ThreadLocal获取当前资源绑定同一个SQLSession

未开启事务:每次查询,spring关闭旧的SslSession,创建一个新的Sqlsession对象,一级缓存补气作用

还有一种特殊情况,也会调用到缓存:

        ProcessDef list = processMapper.selectByPrimaryKey(5L);list.setCode("123");ProcessDef list1 = processMapper.selectByPrimaryKey(5L);

(注意,上面这个方法要加上@Transaction注解)
像上面这种情况,有时候在代码中也会出现,然后你就会找bug找半天都找不出问题;
结果是:list1的结果中的Code字段是“123”,而不是数据库中的那个字段!是不是不可思议,你可以自己在本地试试,事实就是如此。
原因是什么呢? 上面第一次查询直接去数据库查,这个可以理解, list.setCode(“123”);之后,第一次查询出来的缓存就已经变了,其中code字段就变成123了,所以这也是list1中code字段为123的原因!(这种情况大家要留意一下,搞了我半天的时间去找bug)
二级缓存:
mapper级别,同一个namespace下的mapper,有一个Map。

SqlSession sqlSession1 = MyBatisUtils.getSqlSession();UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);User user1 = mapper1.queryUserById(1);System.out.println(user1);SqlSession sqlSession2 = MyBatisUtils.getSqlSession();UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);User user2 = mapper2.queryUserById(1);System.out.println(user2);

不使用二级缓存,会执行2次查询。

一篇读懂--mybatis的缓存相关推荐

  1. 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等

    1.引言 关于"负载均衡"的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load ...

  2. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

  3. 一篇读懂无线充电技术(附方案选型及原理分析)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一篇读懂无线充电技术(附方案选型及原理分析) 0.背景 1.无线供电特 ...

  4. 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信

    一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一文读懂 ...

  5. 一篇读懂可转债基金、二级债基、一级债基、纯债基

    一篇读懂可转债基金和二级债基以及一级债基 2017年11月23日 08:25 来源: 基金吧 编辑:东方财富网 [一篇读懂可转债基金和二级债基以及一级债基]目前,国内债券型基金,已经可以根据其投资范围 ...

  6. [一篇读懂]C语言五讲:指针

    [一篇读懂]C语言五讲:指针 1. 指针的本质(间接访问原理) 1 指针的定义 2 取地址操作符与取值操作符,指针本质 2. 指针的==传递==使用场景 1 指针的传递 [例1.1]指针的传递使用场景 ...

  7. 操作系统原理_读懂操作系统之缓存原理(cache)(三)

    本节内容计划是讲解TLB与高速缓存的关系,但是在涉及高速缓的前提是我们必须要了解操作系统缓存原理,所以提前先详细了解下缓存原理,我们依然是采取循序渐进的方式来解答缓存原理,若有叙述不当之处,还请批评指 ...

  8. 一篇读懂什么是白盒测试

    一提到白盒测试大家想到白盒级测试就是对代码本身去做测试,而白盒测试真正的定义是什么呢?相信大家读完这篇文章后,就会对白盒测试这个概念有一个更加清晰的认识了. 1.白盒测试是什么? "白盒测试 ...

  9. 初学者选黑卡还是微单_零基础,一篇读懂单反和微单

    许多小白在选购相机时,常常会纠结选微单还是选单反. 那么这次就来一篇通俗讲解:单反和微单有什么区别?谁更好?应该怎么选择? 一.单反和微单有什么区别? 在了解单反和微单的区别之前,我们先要了解它俩到底 ...

最新文章

  1. ASP.NET Aries 入门开发教程4:查询区的下拉配置
  2. linux 查看文件工具,lsof---Linux查看文件信息的强大工具
  3. 中文格式_财务必会Excel技巧,将数字转换成中文的5种方式
  4. 高度焦虑、凌晨出没、空中飞人,这些竟是 IT 大佬的日常!
  5. CCF201709-4 通信网络(100分)【DFS+BFS】
  6. vue2.0click点击事件修饰符stop阻止单击事件冒泡prevent阻止默认事件
  7. yii2 配置文件加载顺序, 以及调用自定义配置信息。
  8. grid网格布局基础(一)
  9. 蓝桥杯真题 杨辉三角形 python
  10. 安卓逆向 和 手游辅助 学习 路线
  11. 递归回溯求解数独 C++实现方法
  12. mybatis order by concat用法
  13. 无法在计算机上读取移动硬盘,解决苹果电脑不能读写移动硬盘
  14. 用Python实现最强大脑游戏
  15. 通灵学院|游戏设计研习10:迭代流程★(2000字)
  16. 【实用教程】让我来帮你一键下载公zhong号图文封面吧(文末附小白教程)
  17. 2020-09-01:mysql里什么是检查点、保存点和中间点?
  18. 【26】地图可视化:基于 Echarts + Java SpringBoot 的动态实时地图组件 - 点气泡流向组合区域三级下钻地图
  19. Vs2010安装svn
  20. Obsidian Windows同步到iCloud 再到ipad 云盘 我的电脑导航栏无法应用的问题

热门文章

  1. Spring Boot 如何解决多个定时任务阻塞问题?
  2. 绝了,66道并发多线程面试题汇总
  3. 彻底搞懂 Java 中的注解 Annotation
  4. Oracle view 小结片段
  5. Python3之logging输出写入日志
  6. Tez 0.9安装部署+hive on tez配置 + Tez-UI
  7. mysql galera status_MySQL galera cluster集群的监控
  8. openssl rsa密钥
  9. 沈阳职业计算机学院宿舍几人间,沈阳工学院宿舍怎么样 住宿条件好不好
  10. pagerank数据集_从小白视角理解数据挖掘十大算法