通过源码分析mybatis的缓存

称雄      2022-04-14     756

关键词:

  看了通过源码分析MyBatis的缓存这篇文章后,自己跟着源码过了一遍,对mybatis的一级缓存和二级缓存有了更清楚的认识。

  一级缓存是SqlSession级别的,同一个sqlSession在第二次执行一个相同参数的select语句并且第一次执行后没有对数据进行更新,就会直接从缓存取值,而不再进行查找。通过阅读源码了解了这个过程,首先org.apache.ibatis.session.defaults.DefaultSqlSession.select(String, Object, RowBounds, ResultHandler)方法会调用executor.query(ms, wrapCollection(parameter), rowBounds, handler),然后分析executor的类型,在org.apache.ibatis.session.defaults.DefaultSqlSessionFactory类中,openSessionFromDataSource(ExecutorType, TransactionIsolationLevel, boolean)方法的Executor executor = configuration.newExecutor(tx, execType) 语句实例化executor,代码如下,在SqlMapConfig.xml中cacheEnabled默认为true,即一级缓存默认开启,故executor为CachingExecutor类型。

/*     */   public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
/* 540 */     executorType = executorType == null ? defaultExecutorType : executorType;
/* 541 */     executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
/*     */     Executor executor;
/* 543 */     if (ExecutorType.BATCH == executorType) {
/* 544 */       executor = new BatchExecutor(this, transaction); } else { Executor executor;
/* 545 */       if (ExecutorType.REUSE == executorType) {
/* 546 */         executor = new ReuseExecutor(this, transaction);
/*     */       } else
/* 548 */         executor = new SimpleExecutor(this, transaction);
/*     */     }
/* 550 */     if (cacheEnabled) {
/* 551 */       executor = new CachingExecutor(executor);
/*     */     }
/* 553 */     Executor executor = (Executor)interceptorChain.pluginAll(executor);
/* 554 */     return executor;
/*     */   }
/*     */   

 

  在org.apache.ibatis.executor.CachingExecutor.query(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql)方法中首先获取二级缓存,由于二级缓存为空,执行该语句

return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);

  delegate对象为org.apache.ibatis.executor.SimpleExecutor类型,继承自org.apache.ibatis.executor.BaseExecutor类,query方法如下

BaseExecutor的属性localCache是个PerpetualCache类型的实例,PerpetualCache类是实现了MyBatis的Cache缓存接口的实现类之一,内部有个Map<object, object>类型的属性用来存储缓存数据。 这个localCache的类型在BaseExecutor内部是写死的。 这个localCache就是一级缓存!

 

在数据更改时会清空缓存。

 

 

 

二级缓存是基于namespace的,必须在sqlSession提交或关闭才会生效。需要在mapper配置文件加上<cache />。

mybatis源码分析之05一级缓存

...要明白,mybatis的一级缓存就是指SqlSession缓存,Map缓步!通过前面的源码分析知道mybatis框架默认使用的是DefaultSqlSession,它是由DefaultSqlSessionFactory创建的,下面是源码privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsol 查看详情

mybatis源码分析之06二级缓存

...缓存, 该篇从源码角度去分析mybatis是如何做到的。通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置<cacheeviction="LRU"type="qinfeng.zheng.RedisCache"/> MYBATIS源码分析之02配置文件解析 这篇文章讲解了m 查看详情

mabatis学习---源码分析mybatis缓存原理

...个重要的组件,MyBatis自然也在内部提供了相应的支持。通过在框架层面增加缓存功能,可减轻数据库的压力,同时又可以提升 查看详情

mybatis源码分析五mybatis的缓存

...Batis运行过程应用MyBatis缓存的二层体系一级缓存一级缓存源码分析二级缓存二级缓存源码分析二级缓存的创建缓存创建的时机二级缓存创建的方法 查看详情

mybatis源码分析五mybatis的缓存

...Batis运行过程应用MyBatis缓存的二层体系一级缓存一级缓存源码分析二级缓存二级缓存源码分析二级缓存的创建缓存创建的时机二级缓存创建的方法 查看详情

mybatis缓存的使用和源码分析

Mybatis缓存使用在Mybatis中缓存分为一级缓存和二级缓存,二级缓存又称为全局缓存,默认一级缓存和二级缓存都是开启的,只是二级缓存的使用需要配置才能生效,在Mybatis中一级缓存是SqlSession级别也就是会话级别的,而二级缓... 查看详情

mybatis源码分析-缓存原理(代码片段)

...acheKey4.一级缓存5.二级缓存6.总结参考序号内容链接1MyBatis源码分析-MyBatis入门https://thinkwon.blog.csdn.net/article/details/1148088522MyBatis源码分析-配置文件解析过程https://thinkwon.blog.csdn.net/article/details/1148089623MyBatis源码分析-映射文件解析过... 查看详情

mybatis的缓存机制源码分析之二级缓存解析(代码片段)

引言本篇源码解析基于mybatis3.5.8版本。MyBatis中的缓存指的是MyBatis在执行一次SQL查询时,在满足一定的条件下,会把这个sql和对应的查询结果缓存起来。当再次执行相同SQL语句的时候,就会直接从缓存中进行提取,... 查看详情

mybatis的缓存机制源码分析之一级缓存解析(代码片段)

文章目录引言正文引言本篇源码解析基于mybatis3.5.8版本。MyBatis中的缓存指的是MyBatis在执行一次SQL查询时,在满足一定的条件下,会把这个sql和对应的查询结果缓存起来。当再次执行相同SQL语句的时候,就会直接从缓... 查看详情

mybatis源码阅读之--本地(一级)缓存实现原理分析

前言:Mybatis为了提升性能,内置了本地缓存(也可以称之为一级缓存),在mybatis-config.xml中可以设置localCacheScope中可以配置本地缓存的作用域,包含两个值session和statement,其中session选项表示本地缓存在整个session都有效,而state... 查看详情

myabtis源码分析四-缓存模块分析,装饰模式的使用(代码片段)

一、Mybatis缓存模块分析mybatis缓存模块具备以下特点:MyBatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能;除核心功能之外,有很多额外的附加功能,如:防止缓存击穿,添... 查看详情

mybatis源码解析(代码片段)

...我们解决复杂对象的创建:1.2处理SQL请求的流程1.2.1通过sqlSession中提供的API方法来操作数据库1.2.2获取接口的代码对象-得到的其实是通过JDBC代理模式获取的一个代理对象1.2.3处理完请求之后,需要关闭会话SqlSession1.3底层1... 查看详情

mybatis缓存专题-一文彻底搞懂mybatis一级缓存(代码片段)

...缓存机制详解5.MyBatis关闭一级缓存6.Mybatis的一级缓存机制源码分析7.Mybatis的一级缓存机制源码分析图解总结8.一级缓存什么时候被清空?9.一级缓存key是什么&#x 查看详情

mybatis缓存专题-一文彻底搞懂mybatis一级缓存(代码片段)

...缓存机制详解5.MyBatis关闭一级缓存6.Mybatis的一级缓存机制源码分析7.Mybatis的一级缓存机制源码分析图解总结8.一级缓存什么时候被清空?9.一级缓存key是什么&#x 查看详情

mybatis基于注解mapper源码分析

   目前Mybatis除了可以通过XML配置SQL外还可以通过注解的形式配置SQL,本文中主要介绍了Mybatis是如何处理注解SQL映射的,通过源码分析处理过程 XML配置<configuration> <settings> <settingname="defaultExecutorType"value... 查看详情

吃透mybatis源码-通过分析pagehelper源码来理解mybatis的拦截器

2021一路有你,2022我们继续加油!你的肯定是我最大的动力博主在参加博客之星评比,点击链接,https://bbs.csdn.net/topics/603957267疯狂打Call!五星好评⭐⭐⭐⭐⭐感谢前言面试官:用过pagehelper做分页把,... 查看详情

源码级mybatis缓存策略(一级和二级缓存)(代码片段)

...也提供了对缓存的支持,分为一级缓存和二级缓存,可以通过下图来理解:①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间... 查看详情

mybatis源码解析mybatis执行sql的流程分析(代码片段)

...Configuration配置类reader=Resources.getResourceAsReader(resource);//通过加载配置文件流构建一个SqlSessionFactoryDefaultSqlSessionFactorySqlSessionFactorysqlMapper=newSqlSessionFactoryBuilder().build(reader);//数据源执行器DefaultSqlSessionSqlSessionsession=sqlMapper.o... 查看详情