【九】mybatis 缓存模块设计

mybatis 缓存模块设计

简介:MyBatis提供了一级缓存和二级缓存,其中一级缓存基于SqlSession实现,而二级缓存基于Mapper实现。这里我们就来学习一下MyBatis缓存的使用,并分析MyBatis缓存的实现原理。

首先我们找到缓存模块的源码:

 可以看到有一个父接口Cache,我们以父接口为切入点,先看一下模块整体的类结构设计,如下图所示:

 作者在这里使用了一个装饰器模式,装饰器模式的定义:允许向一个现有的对象添加新的功能,同时又不改变其结构。

一级缓存

一级缓存使用PerpetualCache实例实现的,在BaseExecutor类中应用了PerpetualCache,如下query方法:

这里我们看到在查询之前调用了 createCacheKey(ms, parameter, rowBounds, boundSql)方法,

目的是更新缓存。接下来继续往query方法里面分析,可以看到会先去缓存中查找:

到这里一级缓存就介绍完成了,从类设计到源码使用举例,大家也可以去翻看一下源码了解一下其他场景的使用情况。

 二级缓存

 MyBatis二级缓存在默认情况下是关闭的,因此需要通过设置cacheEnabled参数值为true来开启二级缓存,那么这个配置是在哪里生效的呢?带着这个疑问我们往下进行分析。

首先我们要认识一下mybatis中的Configuration主配置类,我们了解到mybatis中执行器Executor是在如下这个方法中生成的,这里作者采用了工厂模式,Configuration类通过工厂方newExecutor()生成执行器对象。

 看到这里可以知道cacheEnabled参数的使用了,进入到CachingExecutor类中,我们可以看到维护了一个TransactionalCacheManager对象,该对象是用来管理二级缓存的,感兴趣的同学下去可以阅读一下。接下来我将介绍一下二级缓存的使用情况,在CachingExecutor类中query方法里我们同样看到了调用了createCacheKey(ms, parameterObject, rowBounds, boundSql)来更新缓存。

同样进入query方法里,我们发现这里是通过TransactionalCacheManager对象操作的。

 

到这里二级缓存的使用也讲解完成了。

 总结:本文单独介绍了一下mybatis缓存的设计情况,每一次读优秀的源码都是一次洗礼,我们可以学到优秀的设计思想,希望本文对大家有所帮助。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值