互联网架构-Mybatis深入源码分析-014:SQLSession一级缓存原理分析
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集群存在的问题
一级缓存存在哪些问题?
集群环境一级缓存数据不共享,二级缓存共享,脏数据。
如何关闭一级缓存?
方案1:在sql语句上随机生成不同的参数(不推荐);存在缺点:map集合可能爆
方案2:开启二级缓存,二级缓存开启就不会走一级缓存;
上一篇: linux中 ECShop的文件不能写,_PHP教程
下一篇: 这个是 redis 什么的截图 .