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来说它就是 ...
随机推荐
- C#中的深度学习(三):理解神经网络结构
在这篇文章中,我们将回顾监督机器学习的基础知识,以及训练和验证阶段包括哪些内容. 在这里,我们将为不了解AI的读者介绍机器学习(ML)的基础知识,并且我们将描述在监督机器学习模型中的训练和验证步骤. ...
- Excel 多/整列(多/整行)移位操作
步骤1:创建测试数据 步骤2:把B列和C列进行移位操作(整列移位操作,多列移位操作方法一样) 选中B列,鼠标放到B列边缘地带,直到鼠标显示带有四个箭头方向为止,点击键盘shift键进行拖拽,拖拽时显示 ...
- php + redis 实现关注功能
产品价值 1: 关注功能 2: 功能分析之"关注"功能 3: 平平无奇的「关注」功能,背后有4点重大价值 应用场景 在做PC或者APP端时,掺杂点社交概念就有关注和粉丝功能; 数据 ...
- python使用smtplib和email库发送邮件
国内很多服务器提供商都默认禁止了smtp默认的25端口服务,而启用465端口发送邮件 在smtplib库中直接调用SMTP_SSL就是默认使用465端口 示例代码如下: def send_eamil( ...
- [LeetCode]实现数学计算
乘方 思路是:pow(x,n) = pow(x,n/2)*pow(x,n-n/2) 递归实现 public double myPow(double x, int n) { if (n==0) retu ...
- 简单session实现
简单的session校验实现 利用拦截器实现 package com.ryh.blog.intecepter; import org.springframework.core.Ordered; imp ...
- Access-Control-Allow-Headers等基础常识
跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种机制,该机制使用附加的 HTTP 头来告诉浏览器,准许运行在一个源上的Web应用访问位于另一不同源选定的资源. 当一个Web应用发起一个与 ...
- Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随 ...
- java之volatile
一.谈谈对volatile的理解 volatile是java虚拟机提供的轻量级的同步机制 保证可见性.不保证原子性.禁止指令重排 1.可见性理解:所有线程存放都是主内存的副本(比如某个变量值为25), ...
- DAS、SAN和NAS三种服务器存储方式 (转)
转 :https://blog.csdn.net/fgf00/article/details/52592651 2016年09月20日 09:04:00 凌_风 一.存储的分类根据服务器类型分为 ...