mybatis源码分析之走进缓存
之前写了一篇关于mybatis缓存的读后感,想了想还是把缓存模块简单分析一下,附赠下载地址:https://github.com/MyBatis/MyBatis-3,github直接搜排名很靠前的。
先看一张缓存源码包图片:

其实看到这个包,大致可以猜出decorators是装饰器,Cache是缓存的抽象,PerpetualCache类是缓存的具体实现,TransactionalCacheManager应该是关于事务的处理,带着这些猜测首先看下Cache类的源码实现:

可以看到里面都是关于缓存的增删改查操作以及读写锁的支持,但是都是抽象方法,接下来我们可以具体看下我们之前猜测的实现类PerpetualCache:

从红色框标注的看到确实是实现了cache接口的,实现的也很简单,只是使用了HashMap作为缓存容器,以及对map的基本操作。看到这里,是不是觉得这实现的也太简单了吧,而且,这个读写锁return null是什么鬼。我们首先来看是不是真的只是对hashMap的简单操作,回到最上面的图可以看到有一个cacheKey不知道是干什么的,先点进去看看里面写了啥:

进到代码里可以看到有几个核心的参数:

那么这些参数到底是怎么进行操作的呢,我们看一下里面核心的两个方法update和equals:


update方法其实就是通过计算hash值以及简单的运算更新参数,感兴趣的可以仔细研究测试一下,主要目的是为了减少key的冲突,equals则主要根据参数值的对比判断是否是同一个cacheKey,任意点开一个调用update方法的地方:

其实就是sql,节点id,分页信息以及参数信息,对多个值重复计算更新cachekey属性以尽量避免冲突,看到这我们是不是可以想到一个问题,只要nameSpace+分页+sql+参数都一样的话那就是同一个缓存值,哦,确实,都一样的话肯定是同一个。看到这里mybatis的缓存设计的是不是还是有点意思的,但是之前听说mybatis缓存模块设计的挺优雅的,就这样逼格还行但是也算不上优雅吧,我们发现还有一个包里面我们一个都没看过,打开decorators包发现里面都是实现了Cache接口的装饰器,这些装饰器的构造器都是需要传入一个缓存实现的,那么很明显,都是在最基础的PerpetualCache缓存基础上做的装饰而已。
BlockingCache:
首先看一下的get put方法:

可以看出其实就是阻塞版本的缓存装饰器,保证只有一个线程到数据库去查找指定的key对应的数据,而阻塞的实现就是使用可重入锁ReentrantLock控制并发。
FifoCache:

使用linkedList做先进先出的队列。
LoggingCache:

其实也就是在查询之后打印日志。
LruCache:

使用LinkedList实现热点访问。
ScheduledCache:

在每次读写时都会去删除过时的缓存,达到缓存的定时失效。
SerializedCache:


序列化缓存值,每次写入都会先进行序列化操作,读出都会反序列化。
SoftCache:

使用软引用存储缓存value值,若被垃圾回收器回收,则从容器中删除。
SynchronizedCache:

这个就很简单,加synchronized关键字,保证线程安全,这也是为什么二级缓存明明是跨sqlSession的,但是使用hashMap就可以保证线程安全。
TransactionalCache:添加事务处理。
WeakCache:和上面的软引用一样,只不过弱引用包装value值。
ps:软引用是表示垃圾回收器回收的时候,内存不够用才会回收,而弱引用在垃圾回收器回收的时候,无论什么状态,都会将对象回收。
上面其实就是mybatis缓存模块大致的运行机制与实现,还写了一篇文章简单聊了读完mybatis缓存源码,对缓存机制嗯大理解以及使用:https://www.cnblogs.com/gmt-hao/p/12317600.html欢迎大家指教。
mybatis源码分析之走进缓存的更多相关文章
- Mybatis 源码分析之一二级缓存
一级缓存 其实关于 Mybatis 的一级缓存是比较抽象的,并没有什么特别的配置,都是在代码中体现出来的. 当调用 Configuration 的 newExecutor 方法来创建 executor ...
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- Mybatis源码分析之Cache二级缓存原理 (五)
一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(Ser ...
- mybatis源码分析之06二级缓存
上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的. 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 &l ...
- MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析(5)——内置DataSource实现
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
- MyBatis源码分析(4)—— Cache构建以及应用
@(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...
- MyBatis源码分析(3)—— Cache接口以及实现
@(MyBatis)[Cache] MyBatis源码分析--Cache接口以及实现 Cache接口 MyBatis中的Cache以SPI实现,给需要集成其它Cache或者自定义Cache提供了接口. ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...
随机推荐
- iframe高度自动随着子页面的高度变化而变化(不止要在iframe标签里加上this.height=this.contentWindow.document.body.scrollHeight)
最近使用iframe整合页面遇到一些难题,走了很多弯路才解决,借此记录一下: 1 <!-- 页面主体内容 --> 2 <div class="iframe-wrapper& ...
- 附029.Kubernetes安全之网络策略
目录 环境构建 基础环境构建 网络测试 安全策略 策略配置 策略测试 ingress方向测试 egress方向测试 to和from行为 默认策略 环境构建 基础环境构建 [root@master01 ...
- Git的使用以及命令
个人常用命令 git初始化操作 git init 把当前的目录变成git仓库,生成隐藏.git文件. git remote add origin url 把本地仓库的内容推送到GitHub仓库. gi ...
- android 使用 Lottie
1.添加依赖 dependencies { implementation 'com.airbnb.android:lottie:2.5.5'//lottie } 2.1layout实现 <?xm ...
- 【官方免费】Apple Silicon M1 + Parallels 16技术预览版 + Win 10 arm64
期待了好久,终于能用pd运行win10了,其实也就想写个c++,mac上配置个c++编译器太麻烦了.. 步骤: 打开 https://my.parallels.com/desktop/beta,这里下 ...
- 关于django的坑(一)
关于django orm 的坑: 关于设置数据库表自动更新 django的orm关于更新数据库的方法有update和save两种方法.想要表中自动更新需要一下几个条件: 使用 DateTimeFiel ...
- 网页短信平台源码和开发功能介绍 思路和功能 G客短信平台
G客短信源码介绍 (只介绍现有功能模块文字介绍配系统截图) 一:后台首页 QQ:290615413 VX:290615413
- .netcore 急速接入第三方登录,不看后悔
新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢. 如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下: https://oauthlogin.net/ 前言 此次带来得这个小 ...
- 操作系统-1w字关于内存的总结
内存的基本概念 什么是内存,有何作用 内存是用于存放数据的硬件.程序执行前需要先放入内存中才能被CPU处理 存储单元 内存中也有一个一个的小房间,每个小房间就是一个存储单元. 如果计算机按照 字节编址 ...
- MongoDB Sharding(二) -- 搭建分片集群
在上一篇文章中,我们基本了解了分片的概念,本文将着手实践,进行分片集群的搭建 首先我们再来了解一下分片集群的架构,分片集群由三部分构成: mongos:查询路由,在客户端程序和分片之间提供接口.本次实 ...