应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Mybatis的缓存讲解

  前段时间阿粉的一个朋友和阿粉吃饭,在吃饭的时候和阿粉疯狂的吐槽面试官,说面试官问的问题都是些什么问题呀,我一个干了三四年的开发,也不说问点靠谱的,阿粉很好奇,问题问完基础的,一般不都是根据你自己的简历进行提问么?而接下来他说的出来的问题,阿粉表示,阿粉需要继续学习了。
  Mybatis是什么?
  说到这个,读者大人们肯定心想,阿粉是在开玩笑么?你一个Java程序员,你不知道Mybatis是啥么?不就是个持久层的框架么,这东西有啥好说的呢?但是阿粉还是要给大家说。
  Mybatis是一个半自动ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,我们开发的时候只需要关注如何编写SQL语句,而不用关心其他的。
  为什么说Mybatis是一个半自动ORM的框架呢?
  ORM,是Object和Relation之间的映射,而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM框架,而Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
  这也是为什么有些面试官在面试初级程序员的时候,很喜欢说,你觉得Mybatis,和Hibernate都有什么优缺点,为啥你们选择使用的Mybatis而不选择使用Hibernate呢?
  我们都说了Mybatis是什么了,接下来肯定需要说说面试官都问了什么问题,能让阿粉的朋友变得非常犹豫。Mybatis的一级、二级缓存是什么你了解么?Mybatis的一级缓存
  我们先说Mybatis的一级缓存,因为这是如果不手动配置,他是自己默认开启的一级缓存,一级缓存只是相对于同一个SqlSession而言,参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
  当我们面试的时候,说完这个,一般情况下,面试官一定会追问下去,毕竟技术就是要问到你的知识盲区才会停止。
  那我们就来画个图表示一下一级缓存
  那面试官肯定会说,直接从数据库查不就行了,为啥要一级缓存呢?
  当我们使用MyBatis开启一次和数据库的会话时,MyBatis会创建出一个SqlSession对象表示一次与数据库之间的信息传递,在我们执行SQL语句的过程中,们可能会反复执行完全相同的查询语句,如果不采取一些措施,我们每一次查询都会查询一次数据库,而如果在极短的时间内做了很多次相同的查询操作,那么这些查询返回的结果很可能相同。
  也就是说,如果我们在短时间内,频繁的去执行一条SQL,查询返回的结果本来应该是改变了,但是我们查询出来的时候,会出现结果一致的情况,正是为了解决这种问题,也为了减轻数据库的开销,所以Mybatis默认开启了一级缓存。Mybatis的二级缓存
  Mybatis的二级缓存一般如果你不对他进行设置,他是不会开启的,而二级缓存是什么呢?Mybatis中的二级缓存实际上就是mapper级别的缓存,而这时候肯定会有人说,那么不同之间的Mapper是同一个缓存么?
  答案是否定的,他不是一个,Mapper级别的缓存实际上就是相同的Mapper使用的是一个二级缓存,但是在二级缓存中,又有多个不同的SqlSession,而不同的Mapper之间的二级缓存也就是互相不会影响的。
  就类似下面的图
  这二级缓存是不是就看起来有点意思了?
  那怎么能够开启二级缓存呢?
  1。MyBatis配置文件settingssettingnamecacheEnabledvaluetruesettings
  2。MyBatis要求返回的POJO必须是可序列化的
  3。Mapper的xml配置文件中加入标签
  既然我们想要了解这个二级缓存,那么必然,我们还得知道它里面的配置都有哪些含义。
  我们先从标签看起,然后从源码里面看都有哪些配置信息提供给我们使用:
  blocking:直译就是调度,而在Mybatis中,如果缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。
  eviction:缓存回收策略
  而缓存回收策略,在源码中是有直接体现的,那么他们分别都对应了什么形式呢?typeAliasRegistry。registerAlias(PERPETUAL,PerpetualCache。class);typeAliasRegistry。registerAlias(FIFO,FifoCache。class);typeAliasRegistry。registerAlias(LRU,LruCache。class);typeAliasRegistry。registerAlias(SOFT,SoftCache。class);typeAliasRegistry。registerAlias(WEAK,WeakCache。class);PERPETUAL:选择PERPETUAL来命名缓存,暗示这是一个最底层的缓存,数据一旦存储进来,永不清除。好像这种缓存不怎么受待见。FIFO:先进先出:按对象进入缓存的顺序来移除它们LRU:最近最少使用的:移除最长时间不被使用的对象。SOFT:软引用:移除基于垃圾回收器状态和软引用规则的对象。WEAK:弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
  大家虽然看着PERPETUAL排在了第一位,但是它可不是默认的,在Mybatis的缓存策略里面,默认的是LRU。
  PERPETUAL:
  源代码如下:publicclassPerpetualCacheimplementsCache{privatefinalStringid;privateMapObject,ObjectcachenewHashMap();publicPerpetualCache(Stringid){this。idid;}
  恩?看着是不是有点眼熟,它怎么就只是包装了HashMap?你还别奇怪,他还真的就是使用的HashMap,不得不说,虽然人家是使用的HashMap,但是那可是比咱们写的高端多了。
  既然使用HashMap,那么必然就会有Key,那么他们的Key是怎么设计的?
  CacheKey:publicclassCacheKeyimplementsCloneable,Serializable{privatestaticfinallongserialVersionUID1146682552656046210L;publicstaticfinalCacheKeyNULLCACHEKEYnewNullCacheKey();privatestaticfinalintDEFAULTMULTIPLYER37;privatestaticfinalintDEFAULTHASHCODE17;privatefinalintmultiplier;privateinthashcode;用于表示CacheKey的哈希码privatelongchecksum;总和校验,当出现复合key的时候,分布计算每个key的哈希码,然后求总和privateintcount;当出现复合key的时候,计算key的总个数8212017Sonarlintflagsthisasneedingtobemarkedtransient。Whiletrueifcontentisnotserializable,thisisnotalwaystrueandthusshouldnotbemarkedtransient。privateListObjectupdateList;当出现复合key的时候,保存每个key
  确实牛逼,至于内部如何初始化,如何进行操作,大家有兴趣的可以去阅读一下源码,导入个源码包,打开自己看一下。
  FIFO:先进先出缓冲淘汰策略publicclassFifoCacheimplementsCache{privatefinalCachedelegate;被装饰的Cache对象privatefinalDequeObjectkeyList;用于记录key进入缓存的先后顺序privateintsize;记录了缓存页的上限,超过该值需要清理缓存(FIFO)publicFifoCache(Cachedelegate){this。delegatedelegate;this。keyListnewLinkedList();this。size1024;}
  在FIFO淘汰策略中使用了Java中的Deque,而Deque一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Queue接口,因为LinkedList进行插入、删除操作效率较高。
  当你看完这个源码的时候,是不是就感觉源码其实也没有那么难看懂,里面都是我们已经掌握好的知识,只不过中间做了一些操作,进行了一些封装。
  LRU:最近最少使用的缓存策略
  而LUR算法,阿粉之前都说过,如果对这个算法感兴趣的话,文章地址给大家送上,经典的LRU算法,你真的了解吗?
  而我们需要看的源码则是在Mybatis中的源码,publicclassLruCacheimplementsCache{privatefinalCachedelegate;privateMapObject,ObjectkeyMap;privateObjecteldestKey;记录最少被使用的缓存项keypublicLruCache(Cachedelegate){this。delegatedelegate;setSize(1024);重新设置缓存的大小,会重置KeyMap字段如果到达上限则更新eldestKey}publicvoidputObject(Objectkey,Objectvalue){delegate。putObject(key,value);删除最近未使用的keycycleKeyList(key);}
  SOFT:基于垃圾回收器状态和软引用规则的对象
  在看到基于垃圾回收器的时候,阿粉就已经开始兴奋了,竟然有GC的事情,那还不赶紧看看,这如此高大上(装杯)的事情,来瞅瞅吧!publicclassSoftCacheimplementsCache{在SoftCache中,最近使用的一部分缓存项不会被GC回收,这就是通过将其value添加到privatefinalDequeObjecthardLinksToAvoidGarbageCollection;引用队列,用于记录GC回收的缓存项所对应的SoftEntry对象privatefinalReferenceQueueObjectqueueOfGarbageCollectedEntries;底层被修饰的Cache对象privatefinalCachedelegate;连接的个数,默认是256privateintnumberOfHardLinks;publicSoftCache(Cachedelegate){this。delegatedelegate;this。numberOfHardLinks256;this。hardLinksToAvoidGarbageCollectionnewLinkedList();this。queueOfGarbageCollectedEntriesnewReferenceQueue();}publicvoidputObject(Objectkey,Objectvalue){清除被GC回收的缓存项removeGarbageCollectedItems();向缓存中添加缓存项delegate。putObject(key,newSoftEntry(key,value,queueOfGarbageCollectedEntries));}publicObjectgetObject(Objectkey){Objectresultnull;查找对应的缓存项SuppressWarnings(unchecked)assumeddelegatecacheistotallymanagedbythiscacheSoftReferenceObjectsoftReference(SoftReferenceObject)delegate。getObject(key);if(softReference!null){resultsoftReference。get();已经被GC回收if(resultnull){从缓存中清除对应的缓存项delegate。removeObject(key);}else{See586(and335)modificationsneedmorethanareadlocksynchronized(hardLinksToAvoidGarbageCollection){hardLinksToAvoidGarbageCollection。addFirst(result);if(hardLinksToAvoidGarbageCollection。size()numberOfHardLinks){hardLinksToAvoidGarbageCollection。removeLast();}}}}returnresult;}publicvoidclear(){synchronized(hardLinksToAvoidGarbageCollection){清理强引用集合hardLinksToAvoidGarbageCollection。clear();}清理被GC回收的缓存项removeGarbageCollectedItems();delegate。clear();}其中指向key的引用是强引用,而指向value的引用是弱引用privatestaticclassSoftEntryextendsSoftReferenceObject{privatefinalObjectkey;SoftEntry(Objectkey,Objectvalue,ReferenceQueueObjectgarbageCollectionQueue){super(value,garbageCollectionQueue);this。keykey;}}
  WEAK:基于垃圾收集器状态和弱引用规则的对象publicclassWeakCacheimplementsCache{privatefinalDequeObjecthardLinksToAvoidGarbageCollection;privatefinalReferenceQueueObjectqueueOfGarbageCollectedEntries;privatefinalCachedelegate;privateintnumberOfHardLinks;publicWeakCache(Cachedelegate){this。delegatedelegate;this。numberOfHardLinks256;this。hardLinksToAvoidGarbageCollectionnewLinkedList();this。queueOfGarbageCollectedEntriesnewReferenceQueue();}
  WeakCache在实现上与SoftCache几乎相同,只是把引用对象由SoftReference软引用换成了WeakReference弱引用。
  在这里阿粉也就不再多说了,关于Mybatis的二级缓存,你了解了么?下次遇到面试官问这个的时候,你应该知道怎么成功(装杯)不被打了吧。

乔尔杰维奇选中CBA三大后卫,黑马力压赵继伟郭艾伦,赵睿无缘北京时间12月11日,CBA常规赛第二阶段开战以来,不少球队的表现都给人眼前一亮的感觉,相比第一阶段各支球队的实力悬殊严重,甚至有的球队外援都没有到齐,也有的球队伤员较多,所以……我和爸爸的高原当我提起笔写这篇文章的时候,就像手里握着一把刀,直刺心灵深处最痛的地方。37岁的我,不记得什么时候喊过一声爸爸。不是因为我没有爸爸,而是因为我面对爸爸时,怎么也喊不出爸爸这两个……世界杯奇闻趣事NO。10:英国报纸开玩笑英国的报纸也出过丑,第四届世界杯赛上美国队爆冷门以1:0击败英格兰队,记者发稿回去时,编辑认为记者开玩笑,自己还把比数改为1:……潘虹和刘雪华长相相似,可是气质却大不同,原因都在穿衣打扮当中这个世界上有长相十分相似的人,但是却很难出现气质相同的人,就比如潘虹跟刘雪华,她们两个就是属于长相相似,气质截然不同的类型,面部线条窄而长、骨骼突出、唇薄杏眼,以至于很多人都分……支付宝等5家机构首批通过个人金融信息保护能力认证近日,国内公布了首批通过个人金融信息保护能力认证的机构,支付宝(中国)网络技术有限公司等5家机构获北京国家金融科技认证中心认证通过。个人金融信息保护旨在切实保护金融消费者的权益……(科技)中国和新西兰科考人员到达克马德克海沟最深点新华社新西兰奥克兰11月27日电(记者郭磊卢怀谦)中国新西兰联合深渊深潜科考队27日在新西兰奥克兰表示,首次中国新西兰联合深渊深潜科考航次第一航段科考任务顺利完成,两国科考人员……早上起床第一件事不是穿衣喝水,按顺序做好6件事,效果不赖最近几年大家的养生意识逐渐高涨,开始注重生活方方面面有没有什么不足之处。比如补充水分这件事,很多人在早上穿衣起床后的第一件事就是喝一杯水润润喉,同时也有利于身体健康。老李……4方交易方案,涉及8球员5选秀权!湖人勇士赚大了,黄蜂送温暖在今天勇士对阵爵士的比赛中,勇士缺少了库里、格林、威金斯三大主力球员,不过在普尔、库明加、以及克莱的带领下,他们还是与爵士苦战至最后时刻,遗憾的是,普尔在最后1。4秒出现边线球……Apple注册商标xrOS作为其虚拟现实操作系统的新名称每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。彭博社的MarkGurman在他最近的一篇文章中报道称,苹果将使用……超越梅罗?世界杯5大新星蒙面侠第1贝林第2!恩佐第3加克波第在世界杯小组赛阶段,梅西、C罗和姆巴佩成为了许多媒体的头条新闻,但在卡塔尔世界杯上,还有许多球星达到了同样的高度,抢了他们的一些热度。以下是卡塔尔世界杯小组赛阶段,取得突破的5……潘多拉病毒苏醒雅库蒂亚湖永冻土48500年的史前巨型病毒复活据ETtoday(记者叶睿涵):北半球有四分之一的土地被永冻土覆盖,但随着全球暖化加剧,大片永冻土正在逐渐融化,导致已潜伏其中数十万年的大量微生物被释放,引发科学家担忧,认为它……县域经济榜单出炉42地GDP超千亿,义乌人均收入超8。6万元中新经纬11月29日电11月29日,稷夏全国综合竞争力百强县(市,区)等榜单发布。数据显示,GDP超千亿县(市)增至42个,分布11省份。榜单由稷夏智库受权根据中国社会科……
女人上了年纪,少穿这3条假时髦真土气裤子,难看又没气质抗老好物推荐品牌好物女人要美得自然。在香奈儿的经典语录中,猫姐唯独对这句话印象深刻。在现代社会,越来越多的中年女性开始注重维护自己的外在形象,但很多人往往在穿衣打扮中会走……依山傍水生态新村来源:人民日报巴麦全景。本报记者杨烁壁摄牧民新居。本报记者姜峰摄山涧潺潺。本报记者杨烁壁摄巴麦村位于青海省玉树藏族自治州囊谦县白扎乡,是三江源国家公园澜……宇宙探秘,了解宇宙必看,其边界大约有100多亿光年宇宙,人类所在的空间。人类观察到的宇宙,其边界大约有100多亿光年,由众多的星系、星系团、超星系团等组成。星系聚集成星系团、超星系团。平均每个星系团约有百余个星系,……中国女排喜迎新队长,袁心玥胜出,蔡斌扶正王云蕗,将搭档李盈莹时间过得飞快,失败的东京奥运会已经远离中国女排将近9个月,这段时间球队没有任何的大赛,中国队也是请来了蔡斌这位号称诸葛的名帅,来带领7仙女们继续冲击世界冠军。如今,距离世界女排……刘学州自杀的16个定理出生时就被亲生父母贩卖,四岁时养父母去世十几岁光阴,一生坎坷,饱受欺凌。不用去追求细节,就知道刘学州这短暂一辈子,是如何走过来的。他最后说:生时亦轻,还时亦净……洞天皓月仙佛洞五女峰仙佛洞开天辟地时就有!在五女峰的洞天皓月景区,有一个仙佛洞,两面出口相通,深92米,高和宽各两米有余,人们可在里面行走自如。传说,因为有个和尚在这里修道成仙,……9位武打男星背后的女人,貌美如花迷倒潇洒硬汉,个个都不简单娱乐圈里的明星俯拾即是,功夫派却屈指可数,尤其是在现在偶像市场的冲刷下,国内功夫明星出现青黄不接的现状。现在提到功夫明星,观众说得出来名字的一只手数得过来,成龙,洪金宝,……朱莉去了乌克兰!穿一身灰色背着双肩包接地气,素颜也难挡巨星范安吉丽娜朱莉一直以来都热衷于人道主义事业,她自己收养了好几个孩子,之前也经常去访问难民营。而当地时间周五,朱莉竟然在乌克兰现身了,要知道,如今的俄乌战争还没有结束,而乌克兰现在……红薯和这3种东西一起煮,花钱少营养高,冬天常喝睡眠都好了红薯和这3种东西一起煮,花钱少营养高,冬天常喝睡眠都好了虽然烤红薯很好吃,但是红薯最健康的吃法就是熬汤或者煮粥了。寒冷的冬天,来一碗红薯粥,香喷喷的,喝完整个身体都暖洋洋……直播预告迎接2022年的第一缕阳光四季更迭时光流转又一个被按下快进键的365天2021年即将结束回顾这一年可能有很多计划都没赶得上变化但过去的已经过去那就和2021好好……最强主播队再次迎战LPL职业战队,RA乐言评价莎莉他的豹女还前言在最近有这么一支业余战队成为了LPL观众们的关注焦点,这个战队就是五个千万王者选手组成的HYA战队,而最近这个战队可谓是在德杯比赛当中出尽了风头,毕竟HAY战队在小组……王者荣耀v7新皮肤马上热辣来袭大家好,我是殃及,今天呢,给大家带来了有关贵族7的皮肤预测,与小编一起来看看吧。V7贵族皮肤预测!我们打开贵族特权界面,V4送项羽的海滩派对(阳光,沙滩,还有我的鸭……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网