mybatis一级缓存和二级缓存区别点

本文深入探讨了MyBatis的一级缓存和二级缓存。一级缓存是基于SqlSession,每次打开新的SqlSession时,一级缓存会失效。二级缓存则是基于namespace,数据存储在MappedStatement对象中,可以跨SqlSession使用。在解析mapper.xml文件时,MyBatis会初始化二级缓存,并将其与MappedStatement关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们通常说mybatis中一级缓存是sqlSession级别的,二级缓存是namespace级别的,这篇笔记主要来记录下这么说的原理

结论

先说结论吧,一级缓存之所以说是sqlSession级别的,是因为一级缓存的数据是存放在了sqlSession的一个内部属性中,所以,每次openSession()开启一个sqlSession之后,一级缓存就会失效
二级缓存之所以可以跨sqlSession,是因为二级缓存的数据,是存放在mappedStatement对象中的一个内部属性中,这里说的内部属性其实不太准确,但是先忽略,后面会详细解释
我们知道,mybatis在启动的时候,会解析全局配置文件,会把mapper.xml文件中的一个个sql片段,解析成一个个mappedStatement对象,所以,这里二级缓存自然也就是namespace级别的

源码

在mybatis源码中,CachingExecutor是二级缓存的处理类,BaseExecutor是一级缓存的处理类

在这里插入图片描述

我们先来看一级缓存的处理

一级缓存

在这里插入图片描述
这里是一级缓存的处理,会发现,这里是从localCache中根据key获取value的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值