互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析

1 回顾上节课Mybatis代理模式内容

课程内容:
1.MyBatis源码分析之Executor执行器接口分析
2.MyBatis源码分析之PerpetualCache缓存接口分析
3.MyBatis源码分析之集群情况下SqlSession产生的问题
4.MyBatis源码分析之一级缓存设计模式原理分析

2 MyBatis源码分析之Executor执行接口

sqlSession作用:封装增删改查基本api。
sqlSession.selectOne源码分析
1.调用 List list = this.selectList(statement, parameter);
在这里插入图片描述
默认情况查询所有的时候,最多能够查询Integer最大值。

Executor执行器分类:
在这里插入图片描述
SimpleExecutor: 默认的 Executor,每个 SQL 执行时都会创建新的 Statement,都会执行到db中;
ResuseExecutor: 相同的 SQL 会复用 Statement;
BatchExecutor: 用于批处理的 Executor;
CachingExecutor: 可缓存数据的 Executor,用代理模式包装了其它类型的 Executor;

3 MyBatis源码分析之OpenSession分析

SqlSession sqlSession = sqlSessionFactory.openSession();

openSession源码分析:
1)从 configuration 中取出相关的配置,创建事务管理器,创建执行器,最后交给DefaultSqlSession;
在这里插入图片描述
2)默认是创建简单的执行器,最终会变成缓存执行器
在这里插入图片描述
默认创建SimpleExecutor执行器,判断是否开启二级缓存,如果开启了二级缓存,CachingExecutor执行器构造函数传递SimpleExecutor创建缓存执行器;
3)执行query方法,如果没有二级缓存,走简单执行器;
在这里插入图片描述

4 MyBatis源码分析之PerpetualCache分析

2.创建缓存key namespace+id+sql语句+…在这里插入图片描述
为什么CachingExecutor需要使用SimpleExecutor创建缓存key呢?
方便实现缓存key代码复用

Mybatis缓存控制,一级(sqlSession缓存)和二级缓存(sessionFactory),先查找二级缓存(硬盘、redis、ehcache)、二级缓存没有的情况再查找一级缓存(内存)。一级缓存绝对有 ,但是二级缓存可以没有。

3.再执行query方法,去一级缓存中查询;
在这里插入图片描述
PerpetualCache指的就是一级缓存,一级缓存属于本地缓存,存放在内存中,使用map集合存放。

5 MyBatis源码分析之sqlSession一级缓存原理分析

一级缓存底层实现
相同查询sql语句和参数,
第一次查询的时候,会调用数据库的查询,缓存到本地内存中;
第二次查询的时候,直接走本地内存,不会查询数据库。

4.queryFromDatabase查询数据库,查询到的结果放入一级缓存中,返回结果集;
在这里插入图片描述
配置开启日志打印 mybatis_config.xml

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

测试相同sql和参数第二次调用走缓存:在这里插入图片描述

6 MyBatis源码分析之SqlSession执行清理缓存

sqlSession缓存为了防止脏数据,增加、修改、删除的时候,都会清除所有本地一级缓存。
在这里插入图片描述

7 MyBatis源码分析之SqlSession集群存在的问题

一级缓存存在哪些问题?
服务器集群的时候,每个sqlSession有自己独立的缓存相互之间不存在共享,所以在服务器集群的时候容易产生数据冲突问题。集群环境一级缓存数据不共享,二级缓存共享。
在这里插入图片描述
如何关闭一级缓存?
方案1:在sql语句上随机生成不同的参数(不推荐);存在缺点:map集合可能爆
方案2:开启二级缓存,二级缓存开启就不会走一级缓存
方案3 使用sqlSession强制清除缓存
方案4 创建新的sqlSession连接。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值