欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-15 11:41:26
...

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);
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
默认情况查询所有的时候,最多能够查询Integer最大值。

Executor执行器分类:
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
SimpleExecutor: 默认的 Executor,每个 SQL 执行时都会创建新的 Statement,都会执行到db中;
ResuseExecutor: 相同的 SQL 会复用 Statement;
BatchExecutor: 用于批处理的 Executor;
CachingExecutor: 可缓存数据的 Executor,用代理模式包装了其它类型的 Executor;

3 MyBatis源码分析之OpenSession分析

SqlSession sqlSession = sqlSessionFactory.openSession();

openSession源码分析:
1)从 configuration 中取出相关的配置,创建事务管理器,创建执行器,最后交给DefaultSqlSession;
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
2)默认是创建简单的执行器,最终会变成缓存执行器
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
默认创建SimpleExecutor执行器,判断是否开启二级缓存,如果开启了二级缓存,CachingExecutor执行器构造函数传递SimpleExecutor创建缓存执行器;
3)执行query方法,如果没有二级缓存,走简单执行器;
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析

4 MyBatis源码分析之PerpetualCache分析

2.创建缓存key namespace+id+sql语句+…互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
为什么CachingExecutor需要使用SimpleExecutor创建缓存key呢?
方便实现缓存key代码复用

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

3.再执行query方法,去一级缓存中查询;
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
PerpetualCache指的就是一级缓存,一级缓存属于本地缓存,存放在内存中,使用map集合存放。

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

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

4.queryFromDatabase查询数据库,查询到的结果放入一级缓存中,返回结果集;
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
配置开启日志打印 mybatis_config.xml

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

测试相同sql和参数第二次调用走缓存:互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析

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

sqlSession缓存为了防止脏数据,增加、修改、删除的时候,都会清除所有本地一级缓存。
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析

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

一级缓存存在哪些问题?
集群环境一级缓存数据不共享,二级缓存共享,脏数据。
互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
如何关闭一级缓存?
方案1:在sql语句上随机生成不同的参数(不推荐);存在缺点:map集合可能爆
方案2:开启二级缓存,二级缓存开启就不会走一级缓存;