当前位置:首页 > 生活百科 > mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)

mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)

娇娇1年前 (2023-03-02)生活百科143

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。本文将全面分析MyBatis的二级缓存的设计原理。

MyBatis的缓存机制整体设计以及二级缓存的工作模式

mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)(1)

如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。

mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)(2)

CachingExecutor是Executor的装饰者,以增强Executor的功能,使其具有缓存查询的功能,这里用到了设计模式中的装饰者模式,

CachingExecutor和Executor的接口的关系如下类图所示:

mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)(3)

MyBatis二级缓存的划分

MyBatis并不是简单地对整个Application就只有一个Cache缓存对象,它将缓存划分的更细,即是Mapper级别的,即每一个Mapper都可以拥有一个Cache对象,具体如下:

a.为每一个Mapper分配一个Cache缓存对象(使用<cache>节点配置);

b.多个Mapper共用一个Cache缓存对象(使用<cache-ref>节点配置);

如果你想让多个Mapper公用一个Cache的话,你可以使用<cache-ref namespace="">节点,来指定你的这个Mapper使用到了哪一个Mapper的Cache缓存。

mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)(4)

使用二级缓存,必须要具备的条件

MyBatis对二级缓存的支持粒度很细,它会指定某一条查询语句是否使用二级缓存。

虽然在Mapper中配置了<cache>,并且为此Mapper分配了Cache对象,这并不表示我们使用Mapper中定义的查询语句查到的结果都会放置到Cache对象之中,我们必须指定Mapper中的某条选择语句是否支持缓存,即如下所示,在<select> 节点中配置useCache="true",Mapper才会对此Select的查询支持缓存特性,否则,不会对此Select查询,不会经过Cache缓存。如下所示,Select语句配置了useCache="true",则表明这条Select语句的查询会使用二级缓存。

 <select id="selectByMinSalary" resultMap="BaseResultMap" parameterType="java.util.Map" useCache="true">

总之,要想使某条Select查询支持二级缓存,你需要保证:

1. MyBatis支持二级缓存的总开关:全局配置变量参数 cacheEnabled=true

2. 该select语句所在的Mapper,配置了<cache> 或<cached-ref>节点,并且有效

3. 该select语句的参数 useCache=true

一级缓存和二级缓存的使用顺序

请注意,如果你的MyBatis使用了二级缓存,并且你的Mapper和select语句也配置使用了二级缓存,那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存,即MyBatis查询数据的顺序是:

二级缓存 ———> 一级缓存——> 数据库

二级缓存实现的选择

MyBatis对二级缓存的设计非常灵活,它自己内部实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略如LRU,FIFO等等;另外,MyBatis还允许用户自定义Cache接口实现,用户是需要实现org.apache.ibatis.cache.Cache接口,然后将Cache实现类配置在<cache type="">节点的type属性上即可;除此之外,MyBatis还支持跟第三方内存缓存库如Memecached的集成,总之,使用MyBatis的二级缓存有三个选择:

1.MyBatis自身提供的缓存实现;

2. 用户自定义的Cache接口实现;

3.跟第三方内存缓存库的集成;

MyBatis自身提供的二级缓存的实现

MyBatis自身提供了丰富的,并且功能强大的二级缓存的实现,它拥有一系列的Cache接口装饰者,可以满足各种对缓存操作和更新的策略。

MyBatis定义了大量的Cache的装饰器来增强Cache缓存的功能,如下类图所示。

对于每个Cache而言,都有一个容量限制,MyBatis各供了各种策略来对Cache缓存的容量进行控制,以及对Cache中的数据进行刷新和置换。MyBatis主要提供了以下几个刷新和置换策略:

LRU:(Least Recently Used),最近最少使用算法,即如果缓存中容量已经满了,会将缓存中最近做少被使用的缓存记录清除掉,然后添加新的记录;

FIFO:(First in first out),先进先出算法,如果缓存中的容量已经满了,那么会将最先进入缓存中的数据清除掉;

Scheduled:指定时间间隔清空算法,该算法会以指定的某一个时间间隔将Cache缓存中的数据清空;

mybatis二级缓存优缺点(MyBatis的二级缓存的设计原理)(5)

6. 写在后面(关于涉及到的设计模式)

在二级缓存的设计上,MyBatis大量地运用了装饰者模式,如CachingExecutor, 以及各种Cache接口的装饰器。

本文仅代表作者观点,不代表本站支持或者同意该观点。其原创性、真实性未经本站证实,其内容仅供参考,本站不对其内容承担任何责任。

本文链接:https://www.hloby.com/20230310444.html

相关文章

star法则是什么意思(面试中的star原则的具体例子)

star法则是什么意思(面试中的star原则的具体例子)

前言 本篇文章的作者是来自阿里淘系用户增长前端团队的“亦逊”,18年作为双非本科生通过层层面试,校招进入阿里,今天以过来人的身份给大家分享在面试官问起项目经验时,该如何回答。 说起面试...

候补车票一般多久成功(火车票候补购票方法)

候补车票一般多久成功(火车票候补购票方法)

12月27日起,铁路部门在铁路12306网站(含手机客户端),选取2019年春运能力部分紧张方向列车的长途区段,开展候补购票服务试点,以进一步改善旅客购票体验。 进行候补购票服务试点的节前车...

椰子怎么打开吃椰肉(轻轻锤几下就开椰壳自动脱落)

椰子怎么打开吃椰肉(轻轻锤几下就开椰壳自动脱落)

大家好,这里是每天分享一个生活美食小技巧的金芒美食。现在大街上的椰子就特别的便宜,基本都是九块九块一个,平时不想喝碳酸饮料的时候,开个椰子喝也非常的解渴。但大家是不是每次喝完一个椰子就扔掉...

江疏影个人资料(她的故事真不简单)

江疏影个人资料(她的故事真不简单)

2014年初,有媒体连续两次拍到江疏影和胡歌约会,最终坐实了两人的恋情。 “国民男神”和“知性女神”的搭配,也迎来了一片叫好声,大家纷纷希望他们能修成正果,验证一下爱情的力量。...

nfc功能是什么意思(五大作用方便你的生活)

nfc功能是什么意思(五大作用方便你的生活)

手机支付为我们的生活带来了许多便利,它也逐渐取代现金,成为当下社会主要的交易方式。手机上的NFC功能就与支付离不开关系,除了这一功能,手机上的NFC功能还能有什么意想不到的小妙招呢?让我们一起来看...

如何系鞋带不会松开(三分钟学会鞋带五种系法)

如何系鞋带不会松开(三分钟学会鞋带五种系法)

你的鞋带都是怎么系的呢?是否以那种经典系法一直坚持到现在? 其实不同的鞋带系法,能给同一双鞋带来不同的感觉,更能体现出你对生活的小态度和小情趣。 小细节,大讲究!今天我就来教...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。