之前写了一篇关于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源码分析之走进缓存的更多相关文章

  1. Mybatis 源码分析之一二级缓存

    一级缓存 其实关于 Mybatis 的一级缓存是比较抽象的,并没有什么特别的配置,都是在代码中体现出来的. 当调用 Configuration 的 newExecutor 方法来创建 executor ...

  2. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  3. Mybatis源码分析之Cache二级缓存原理 (五)

    一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(Ser ...

  4. mybatis源码分析之06二级缓存

    上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的. 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 &l ...

  5. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  6. MyBatis源码分析(5)——内置DataSource实现

    @(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...

  7. MyBatis源码分析(4)—— Cache构建以及应用

    @(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...

  8. MyBatis源码分析(3)—— Cache接口以及实现

    @(MyBatis)[Cache] MyBatis源码分析--Cache接口以及实现 Cache接口 MyBatis中的Cache以SPI实现,给需要集成其它Cache或者自定义Cache提供了接口. ...

  9. 【MyBatis源码分析】select源码分析及小结

    示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...

随机推荐

  1. 使用Github快速的寻找项目

    作为一个3年的码农昨天在学习项目,顺便总结一下 ,在Github找项目的几个常用方式 ,如果对您有帮助,可以点个关注,便于下次光顾! 首先我们来看一下常用命令 1.指定搜索方式 搜索文件中有spiri ...

  2. GitHub 上的大佬们打完招呼,会聊些什么?

    你好 GitHub!每一位开源爱好者的好朋友「HelloGitHub」 大家好,今儿 HG 有幸邀请到:Lanking 一位亚马逊 AI 软件工程师.开源爱好者和贡献者.他是亚马逊开源的 Java 深 ...

  3. 神奇的BFC

    BFC是什么? 块格式化上下文(Block/box Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域 ...

  4. 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析

    关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...

  5. Attention & Transformer

    Attention & Transformer seq2seq; attention; self-attention; transformer; 1 注意力机制在NLP上的发展 Seq2Seq ...

  6. 安装篇一:安装VMware12

    #1.安装VMware12 前提:安装不了的解决办法(进入BIOS系统,把虚拟化技术那一项修改为enable) 说明:安装流程(自定义安装)              #2.网络适配器设置 虚拟网络编 ...

  7. Semaphore信号量深度解析

    1. 使用指南 package com.multthread; import java.util.concurrent.ExecutorService; import java.util.concur ...

  8. MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果

    注:MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果: 如下所示: MySQL: select * from tableName where name li ...

  9. 拖拽一个元素如此简单,mouse、drag、touch三兄弟的用处

    最近需要做一个投票活动,上传图片时需要拖拽.缩放来裁剪图片,vue的组件不少,不过自己动手才能丰衣足食,一味使用别人的组件实在难以进步,所以自己研究一番. 一.mouse.drag.touch傻傻分不 ...

  10. JavaSwing 船只停靠管理可视化(一)

    最近抽空闲时间做了船只停靠管理系统,先看一下效果. 停靠泊位管理:实现泊位的 增删改查. JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing ...