MyBatis一级缓存的笔记及记录

一、概述:
   一级缓存是MyBatis天然自带的,是默认开启且没有关闭的地方,1级缓存只能作用于查询回话中,所以也叫会话缓存;

这里举个例子:

  订单表存在一对多的关系,为了尽可能的减少join的查询,进行了分阶段查询; 先查询出订单表,在根据订单的用户ID查询用户信息表,最后将数据进行整合。如果订单表中存在重复的用户ID,就会出现很多没有必要的重复查询。 1级缓存解决了这个问题(1个语句被执行多次,也就是大家说的“N+1”的问题),在同一次查询回话中如果出现相同的语句及参数,就会从缓存中取出,不会直接从数据库端拉取数据。

二、使用条件及限制:
一级缓存又称为本地缓存,大致限制如下:

必须是相同的SQL和参数;
必须是同一个会话;
必须是相同的Mapper;
必须是相同的接口及方法;
查询前不能执行session.clearCache();
查询语句中间不能出现增删改的原子操作,因为“增删改”操作后会自动调用session.clearCache();这里需要注意,是否更新1级缓存是取决于你的注解或者XML原标签,也就是说如果@Update("select * from test where id=#{id}")也会清空1级缓存;
三、实现原理:
  实现了Cache接口——PerpetualCache类,cache变量就是一个简单的HashMap,所以一级缓存就是通过HashMap实现的;

这里需要特别注意一下:

  因为是基于HashMap实现,在查询时另一个会话并发去修改查询的数据的时候,一级缓存会有效,也就是非线程安全,存在并发问题,但是一级缓存又是属于本地缓存而且基于当前会话,所以这个并发问题可以忽略,您难道在自己的代码里还要实现内部并发吗?:);

四、缓存调用逻辑:
调用mapper的执行方法(这里的mapper对象是通过Java代理实现的);
DefaultSqlSession.selectList方法开始进行处理,所有查询都会进入这里;
CachingExecutor.query:缓存执行器开始执行获取数据处理;
BaseExecutor.query:查询缓存信息。这里注意一下,clearLocalCache方法是清空缓存调用的方法,(如果当前没有关闭,就执行清空操作,这里清空是全部清空);
PerpetualCache.getObject:获取缓存;

如果想获取更多IT视频学习资源可以访问https://download.csdn.net/download/hys8298/11818325 或者:http://www.5678xiazai.com/7ilrwbc1bkvscxgj/
后续可能持续更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值