安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Mybatis一级缓存和二级缓存原理与使用

9月21日 断龙塔投稿
  前言
  本文章将介绍Mybatis中的一级缓存和二级缓存。主要是围绕着下列问题去展开什么是一级缓存?为什么使用一级缓存?什么是二级缓存?二级缓存的作用?二级缓存是怎么实现的?
  java数据库开发一级缓存
  Mybatis会在会话对象SqlSession对象中建议一个简单的缓存,将查询到的结果缓存起来,当下次查询的时候,会判断有没有一个完全一样的查询,如果有直接从缓存中返回。否则查询数据库并存入缓存,最后返回给用户。
  这样做主要是避免我们在短时间内,反复地执行相同的查询语句,而得到的结果也是相同的。如果不使用缓存会造成很大的资源浪费。
  一级缓存的原理及源码分析一级缓存默认就开启一级缓存底层是使用HashMap的数据结构存储缓存是在执行器Executor中创建,添加和删除缓存都在这里执行默认的缓存Key有五个部分组成(具体可以查看类:BaseExecutor):statementId:MapStatement的idoffset:分页设置,默认为0,从RowBound分页对象中获取limit:分页最大页数,从RowBound分页对象中获取boundSql:查询的sql语句,从BoundSql对象中获取value:sql的参数,parameter中获取env:当前的环境,如果sqlMapConfig。xml有配置,也会设置到key中
  缓存相关的部分源码展示:
  创建缓存KEY的源码CacheKeycacheKeynewCacheKey();MappedStatement的id。id就是Sql语句的所在位置包名类名SQL名称cacheKey。update(ms。getId());offset就是0cacheKey。update(rowBounds。getOffset());limit就是Integer。MAXVALUEcacheKey。update(rowBounds。getLimit());具体的SQL语句cacheKey。update(boundSql。getSql());后面是update了sql中带的参数cacheKey。update(value);。。。省略一千万行代码if(configuration。getEnvironment()!null){issue176cacheKey。update(configuration。getEnvironment()。getId());}
  BaseExecutor部分query源码:OverridepublicEListEquery(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler)throwsSQLException{BoundSqlboundSqlms。getBoundSql(parameter);创建缓存CacheKeykeycreateCacheKey(ms,parameter,rowBounds,boundSql);returnquery(ms,parameter,rowBounds,resultHandler,key,boundSql);}SuppressWarnings(unchecked)OverridepublicEListEquery(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler,CacheKeykey,BoundSqlboundSql)throwsSQLException{。。。省略一千万行代码listresultHandlernull?(ListE)localCache。getObject(key):if(list!null){处理存储过程的作用handleLocallyCachedOutputParameters(ms,key,parameter,boundSql);}else{如果查不到的话,就从数据库查queryFromDatabase()listqueryFromDatabase(ms,parameter,rowBounds,resultHandler,key,boundSql);}。。。省略一千万行代码}queryFromDatabase中,会对localcache进行写入。localcache对象的put方法最终交给Map进行存放privateEListEqueryFromDatabase(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler,CacheKeykey,BoundSqlboundSql)throwsSQLException{ListElocalCache。putObject(key,EXECUTIONPLACEHOLDER);try{执行查询listdoQuery(ms,parameter,rowBounds,resultHandler,boundSql);}finally{清除缓存中的数据localCache。removeObject(key);}把查询到的数据,重新放入一级缓存中localCache。putObject(key,list);if(ms。getStatementType()StatementType。CALLABLE){localOutputParameterCache。putObject(key,parameter);}}二级缓存
  二级缓存的原理和一级缓存的原理一样,第一次查询,会将数据放入缓存中,然后第二次查询则会直接去缓存中取;二级缓存需要手工开启;二级缓存存储的不是对象,而是对象的数据;因为二级缓存的存放介质很多,可以是内存,磁盘等。因为在取数据的时候需要反序列化操作,所以对象需要实现Serializable接口;二级缓存是基于mapper文件的namespace。多个sqlSession可以共享一个mapper中的二级缓存区域。
  开启默认二级缓存的配置
  开启的方式有以下三种:
  1。在全局配置文件sqlMapConfig。xml添加以下配置开启!开启二级缓存settingssettingnamecacheEnabledvaluetruesettings
  2。在Mapper。xml中添加配置开启!开启二级缓存cachecache
  3。在Mapper类中添加注解开启使用二级缓存,等用于cache属性CacheNamespacepublicinterfaceUserMapper{}
  使用Redis实现二级缓存使用默认的二级缓存实现有哪些弊端?使用缓存中间件实现二级缓存解决了哪些问题?
  使用默认的二级缓存实现,只能在单机系统中使用,不能实现分布式缓存。
  引入缓存中间件redis作为二级缓存的存储介质,可以实现多机分布式缓存数据存储,对缓存数据进行集中管理。添加依赖。在pom。xml中添加以下依赖:dependencygroupIdorg。mybatis。cachesgroupIdmybatisredisartifactIdversion1。0。0beta2versiondependency在resources目录中添加配置redis。properties
  默认情况下,如果项目已经有使用了redis,且没有其他特殊配置,不配置redis。properties也是可以的。redis。hostlocalhostredis。port6379redis。connectionTimeout5000redis。passwordredis。database0指定使用RedisCache作为二级缓存
  xml中配置cachetypeorg。mybatis。caches。redis。RedisCache
  注解中配置CacheNamespace(implementationRedisCache。class)publicinterfaceUserMapper{}RedisCache源码分析实现了Mybatis的Cache接口内部使用jedis封装了对redis的CURD操作使用了redis的Hash数据结构,系列化后存储数据RedisCache在mybatis启动的时候,由MyBatis的CacheBuilder创建
  部分核心源码:实现了Mybatis的Cache接口publicfinalclassRedisCacheimplementsCache{publicRedisCache(finalStringid){if(idnull){thrownewIllegalArgumentException(CacheinstancesrequireanID);}this。调用RedisConfigurationBuilder创建RedisConfigRedisConfigredisConfigRedisConfigurationBuilder。getInstance()RedisConfig核心方法,这个是加载解析redis配置文件的。parseConfiguration();poolnewJedisPool(redisConfig,redisConfig。getHost(),redisConfig。getPort(),redisConfig。getConnectionTimeout(),redisConfig。getSoTimeout(),redisConfig。getPassword(),redisConfig。getDatabase(),redisConfig。getClientName());}。。。}通过类加载器加载redis配置资源,publicRedisConfigparseConfiguration(ClassLoaderclassLoader){PropertiesconfignewProperties();InputStreaminputclassLoader。getResourceAsStream(redisPropertiesFilename);if(input!null){try{加载配置信息到Properties容器中config。load(input);}catch(IOExceptione){thrownewRuntimeException(AnerroroccurredwhilereadingclasspathpropertyredisPropertiesFilename,seenestedexceptions,e);}finally{try{input。close();}catch(IOExceptione){closequietly}}}redisConfig继承了JedisPoolConfigRedisConfigjedisConfignewRedisConfig();开始设置redis配置setConfigProperties(config,jedisConfig);returnjedisC}
  结语
  实际情况中,我个人是比较少直接用到mybatis的二级缓存的。都是自己使用redis缓存在业务上做单独的缓存处理(可能是我项目经验不够吧〔奸笑〕)。但是总体来说,其实也是根据系统开发者的想法业务本身的各种因素去决定的。合适才是最重要的。
  前言中的问题,不知道大家是否已经能知道心里的答案呢?可以评论中写出来巩固自己的理解,也能帮助其他小伙伴哦〔憨笑〕
投诉 评论 转载

我省完成首例完全机器人甲状腺肿瘤切除术兰州晚报讯近日,兰州大学第二医院肿瘤外科陈昊教授团队成功完成1例在完全达芬奇机器人下腔镜甲状腺腺叶及峡部切除术,患者术后24小时即完全恢复。这是甘肃省首例完全机器人甲状腺切除术……微信能被别人监控吗?感谢您的阅读!【微信也能够被监控吗?被微信服务器记录还是被人装了窃听工具】微信被监控来自于两个方面:1。来自于微信本身有没有监控你的聊天记录。这这段话微信确实……那些年花过的冤枉钱今天我想要跟你分享一下我过去花过的冤枉钱,这些东西你别跟我讲什么打折黑5双11就算是买一送一,我也绝对不会再买了。因为我发现只要能够停下来不买这些东西,你不仅可以省很多钱,而且……搭载120W快充和骁龙888,红米K40s超性价比新旗舰太香作为国内性价比机型的品牌担当,红米又快要发布最新的性价比新旗舰红米K40s了,产品的定位与去年的红米K30s类似,都是把国际版机型经过改版后再国内发布。所以据悉,这次红米K40……Mybatis一级缓存和二级缓存原理与使用前言本文章将介绍Mybatis中的一级缓存和二级缓存。主要是围绕着下列问题去展开什么是一级缓存?为什么使用一级缓存?什么是二级缓存?二级缓存的作用?二级缓存是怎么实现的?……魅族宣布4月25日发布新一代音频产品纯净新声,还原精彩IT之家4月20日消息,今天,魅族旗下lifeme青年良品宣布将在4月25日发布新一代,新‘声’代产品。官方打出的slogan是纯净新声,还原精彩还原纯净更真实。IT之家……三星台积电占据全球芯片代工市场,英特尔准备干一场2020年英特尔曾表示,将会在芯片代工上有所作为。到现在,英特尔不仅投资了大量资金,同时,也成立了芯片代工服务部,负责与芯片设计公司合作,提供代工生产业务。长久以来,英特……培育工信领域技能人才,燧光杯5GMR资源开发竞赛启动来源:工人日报客户端原标题:培育工信领域技能人才,燧光杯5GMR资源开发竞赛启动工人日报中工网记者杨召奎为大力培育支撑制造强国、网络强国建设的技术技能人才队伍……宁德时代将推出巧克力换电块适配全球80车型金一丹中国证券报中证网中证网讯(记者金一丹)1月18日,宁德时代在换电品牌EVOGO发布会上宣布,专门为实现共享换电开发量产巧克力换电块,具有小而高能、自由组合、极简设计……知识付费的生意还能做多久自从2013年,公众号罗辑思维推出付费会员制以来,知识付费一词便跃入大众的视野中。其后近10年间,我国知识付费行业这片蓝海以令人目眩的速度扩张。数据显示,2021年,我国知识付……大厂出海,又打起来了图片来源视觉中国文深燃,作者李秋涵,编辑魏佳出海,是眼下互联网大厂的关键词之一。这倒不是各互联网大厂今年才开始的业务,只是在国内互联网流量见顶的环境下,出海正……汽车新零售瞄准换购市场,大搜车与两桶油擦出新火花稳定增加汽车消费成为2021年汽车流通行业的重要工作。今年以来,国家相关部委开展新一轮新能源汽车下乡活动,汽车产业流通提速。与此同时,民众对汽车消费的体验需求也越来越高,市场急……
比尔盖茨的话正在被验证,国内科技巨头联手,打压华为反效果出现助听器双耳互通什么意思?俄罗斯传来新消息,华为赢了马斯克再度出售10亿美元特斯拉股票外国人使用手机时,戴不戴手机壳?2022年哪些新能源值得期待?这几款实力不容小觑!拿着带天气预报和导航的智能手机回古代会不会被古人当做神仙?36氪专访小满科技做跨境B2B已经9年,想用更长期的视角来观市面上的VGA转HDMI转换器,为什么有些需要外接电源,有些自己怎么重装系统?华为Watch3与WatchGT2Pro有什么区别?Python处理PDFPyMuPDF的安装与使用政协联络组副组长任期述职报告喝龙舌兰酒为什么加盐吃柠檬为了中和毒素中和生涩口感《成语故事》读后感最后的一滴水电影推荐喜剧之王周星驰后恋爱降级爱无能是年轻人最大的无奈水乳排行榜平价水乳推荐明朝开国功臣李善长死因为何?江苏社会抚养费征收标准是多少?筑梦情缘大结局,沈其北终于找到了品牌传播的四大定律分居离婚,要注意哪些问题?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利