成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

瀏覽:195日期:2023-10-20 15:08:41
mybatis plus多數(shù)據(jù)源切換

mybatis plus多數(shù)據(jù)源切換使用注解 @DSDS注解作為多數(shù)據(jù)源切點(diǎn),具體實(shí)現(xiàn)作用主要由兩個(gè)類完成DynamicDataSourceAnnotationAdvisorDynamicDataSourceAnnotationInterceptor

DS多數(shù)據(jù)源切換實(shí)現(xiàn)

1.DynamicDataSourceAnnotationAdvisor類實(shí)現(xiàn)切面配置,其中AnnotationMatchingPointcut用于尋找切點(diǎn),進(jìn)入可看到支持類和方法的切點(diǎn),多個(gè)切點(diǎn)會(huì)執(zhí)行多次,根據(jù)代碼順序,方法的切點(diǎn)執(zhí)行晚于類切點(diǎn),所以方法的切點(diǎn)會(huì)覆蓋類,但是都會(huì)被執(zhí)行

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

2.DynamicDataSourceAnnotationInterceptor 實(shí)現(xiàn)切面功能,匹配到切點(diǎn)后,根據(jù)切點(diǎn)值(數(shù)據(jù)源id)設(shè)置當(dāng)前線程有效數(shù)據(jù)源私有變量,用于執(zhí)行查詢時(shí)動(dòng)態(tài)數(shù)據(jù)源能獲取,執(zhí)行完畢會(huì)清楚此變量,此存儲(chǔ)功能由DynamicDataSourceContextHolder提供

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

3.執(zhí)行時(shí)動(dòng)態(tài)數(shù)據(jù)源確定,mybatisplus動(dòng)態(tài)數(shù)據(jù)源實(shí)現(xiàn)類為DynamicRoutingDataSource,其維護(hù)一個(gè)map保存所有配置的數(shù)據(jù)源,以數(shù)據(jù)源ID作為key,執(zhí)行查詢時(shí),獲取連接,交由spring事務(wù)管理器SpringManagedTransaction進(jìn)行連接獲取,若當(dāng)前存在連接則直接返回,不存在是創(chuàng)建連接,只有創(chuàng)建連接時(shí),才有機(jī)會(huì)切換數(shù)據(jù)源,此處需要注意的是,同一事務(wù)下,使用的同一個(gè)sqlSession,執(zhí)行查詢時(shí)使用的是同一個(gè)執(zhí)行器executor,最終使用的是同一個(gè)事務(wù)管理器,所以獲取連接時(shí)無(wú)法創(chuàng)建新連接,mybatisplus切換數(shù)據(jù)源功能失效,代碼無(wú)法被執(zhí)行

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

此處邏輯較多,一筆帶過(guò)有點(diǎn)草率,后續(xù)附帶mybatisplus查詢過(guò)程,感興趣的老鐵一會(huì)在看。

4.動(dòng)態(tài)數(shù)據(jù)源敲定,接第3步,若當(dāng)前事務(wù)管理器還未創(chuàng)建連接,那就打開(kāi)一個(gè)連接,使用DataSourceUtils獲取一個(gè)連接,入?yún)閙ybatisplus的動(dòng)態(tài)數(shù)據(jù)源DynamicRoutingDataSource,一步步往下巴拉,忽略不需要代碼,最終執(zhí)行到了這一句:Connection con = dataSource.getConnection();使用DynamicRoutingDataSource獲取連接,瞧,兜兜轉(zhuǎn)轉(zhuǎn),最終怎么找連接,敲定數(shù)據(jù)源又交給了mybatisplus,getConnection方法在其父級(jí)AbstractRoutingDataSource中,使用this.determineDataSource().getConnection()獲取連接,.getConnection()是數(shù)據(jù)源獲取連接方法,那確定數(shù)據(jù)源顧名思義就是determineDataSource方法了,這個(gè)方法的實(shí)現(xiàn)就在DynamicRoutingDataSource中,來(lái)瞧瞧!是不是瞬間舒服了,根據(jù)第二部切面設(shè)置的數(shù)據(jù)源,這個(gè)返回對(duì)應(yīng)的數(shù)據(jù)源。

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

5.主要邏輯已經(jīng)清楚了,那么來(lái)延伸下,如何手動(dòng)切換數(shù)據(jù)源mybatisplus切換數(shù)據(jù)源主要是使用DynamicDataSourceContextHolder的線程獨(dú)享變量,那么如果沒(méi)有DS切點(diǎn),無(wú)法自動(dòng)切換數(shù)據(jù)源,需要切換數(shù)據(jù)源時(shí)就可以使用DynamicDataSourceContextHolder.setDataSourceLookupKey 設(shè)置數(shù)據(jù)源,使用完后再清除掉(默認(rèn)數(shù)據(jù)源生效),這個(gè)方法同第4步所提的事務(wù)問(wèn)題,存在事務(wù)則無(wú)法切換(壓根就不執(zhí)行 只設(shè)置無(wú)法執(zhí)行切換代碼),如果將要執(zhí)行的代碼已存在切點(diǎn),則執(zhí)行前手動(dòng)設(shè)置也是無(wú)效的,因?yàn)榍悬c(diǎn)會(huì)覆蓋你的設(shè)置。

注:如果需要在事務(wù)存在的情況下切換數(shù)據(jù)源,則估計(jì)要覆蓋掉或替換掉spring的事務(wù)管理器,此處待后續(xù)再議。如果事務(wù)內(nèi)仍需要切換數(shù)據(jù)源,則需要單獨(dú)定義service并設(shè)置切點(diǎn),設(shè)置此切點(diǎn)的事務(wù)傳播行為為PROPAGATION__REQUIRES_NEW,則執(zhí)行切面方法時(shí)單獨(dú)創(chuàng)建一個(gè)事務(wù),數(shù)據(jù)源會(huì)自動(dòng)切換。

mybatisplus執(zhí)行查詢過(guò)程

現(xiàn)分析mybatisplus執(zhí)行查詢過(guò)程

1.執(zhí)行selectById方法,執(zhí)行return this.baseMapper.selectById(id);經(jīng)過(guò)springaop切面進(jìn)行一系列巴拉巴拉的處理,最終進(jìn)入mybatisplus PageMapperMethod類中執(zhí)行execute方法,根據(jù)sql類型進(jìn)行不同處理,分新增,修改,刪除,查詢,我們本次只關(guān)注查詢,查詢里也有很多東西。

可以看到此處提供多種返回值的查詢,有空返回值,多個(gè),map,游標(biāo),及啥也不是。空值查詢猜測(cè)是另有處理器直接處理返回值,此處不做延伸了,有需要再議,回到按照ID查詢及進(jìn)入啥也不是分支,本次查詢不是分頁(yè)查詢,直接進(jìn)入selectOne ,result = sqlSession.selectOne(this.command.getName(), param); 這里的sqlSession是SqlSessionTemplate,執(zhí)行selectOne時(shí)首先獲取sqlSession(默認(rèn)為DefaultSelSession)

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

2.獲取真正的sqlSession并執(zhí)行selectOne查詢,首先使用事務(wù)管理器獲取緩存的sqlSession的持有者(sqlSession包裝類),不存在則創(chuàng)建并緩存注冊(cè)。

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

得到真正的sqlSession后,執(zhí)行selectOne,發(fā)現(xiàn)還是執(zhí)行的selectList,然后就是大眾寫(xiě)法,size=1返回get(0),否則為空或者報(bào)錯(cuò)結(jié)果集太多。

3.來(lái)看看selectList在干嘛,先獲取查詢語(yǔ)句相關(guān)的MappedStatement,然后使用執(zhí)行器executor執(zhí)行查詢 this.executor.query執(zhí)行器是啥?怎么來(lái)的?

執(zhí)行器是sqlSession內(nèi)部的一個(gè)屬性,sqlSession其實(shí)也是個(gè)外包裝,提供了一堆規(guī)范化的操作,但是并不直接實(shí)現(xiàn)這些操作,而是交給執(zhí)行器,執(zhí)行器來(lái)執(zhí)行增刪改查,默認(rèn)使用的是SimpleExecutor,就以他入手,SimpleExecutor繼承抽象類BaseExecutor,BaseExecutor實(shí)現(xiàn)了Executor接口,這個(gè)query就在BaseExecutor中:這里主要是獲取執(zhí)行的sql,以及根據(jù)執(zhí)行語(yǔ)句和入?yún)?lái)生成一個(gè)緩存的key,會(huì)緩存查詢結(jié)果,如果下次再來(lái)個(gè)一毛一樣的查詢 就直接用緩存了,不查了,這個(gè)就是mybatis的一級(jí)緩存,緩存使用的是一個(gè)封裝的類PerpetualCache,最終對(duì)應(yīng)的就是一個(gè)map :private Map<Object, Object> cache = new HashMap();

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

4.執(zhí)行數(shù)據(jù)庫(kù)查詢queryFromDatabase -> doQuery,這里和spring一個(gè)習(xí)慣,真正做事情的都是doXXX前面都是鋪墊前戲,看的人云里霧里的這個(gè)doQuery的實(shí)現(xiàn)在SimpleExecutor中,進(jìn)入查看,先創(chuàng)建了一個(gè)Statement,這個(gè)我知道,是jdbc里的東西,jdbc大概就是加載驅(qū)動(dòng),獲取連接,打開(kāi)一個(gè)執(zhí)行語(yǔ)句塊,然后執(zhí)行獲取結(jié)果。具體這個(gè)東西學(xué)名和作用還是百度下吧:Statement 對(duì)象用于把 SQL 語(yǔ)句發(fā)送到 DBMS。你只須簡(jiǎn)單地創(chuàng)建一個(gè) Statement 對(duì)象并且然后執(zhí)行它,使用適當(dāng)?shù)姆椒▓?zhí)行你發(fā)送的 SQL 語(yǔ)句。這個(gè)也就是jdbc層面的sqlSession了吧。

創(chuàng)建完Statement后就會(huì)執(zhí)行查詢,先看來(lái)看Statement如何創(chuàng)建

5.Statement創(chuàng)建,創(chuàng)建第一步獲取connection,這個(gè)就涉及到數(shù)據(jù)源了吧,進(jìn)入查看,使用事務(wù)管理器Transaction獲取連接,默認(rèn)的事務(wù)管理器是SpringManagedTransaction,然后獲取數(shù)據(jù)源,最終創(chuàng)建或使用一個(gè)已有的連接并返回,進(jìn)而創(chuàng)建出一個(gè)Statement,其他細(xì)節(jié)已無(wú)心再細(xì)究,不影響本次分析目的。

6.執(zhí)行查詢,直接略過(guò)看最終執(zhí)行處,doFinish-> query ,執(zhí)行jdbc的PreparedStatement.execute,之后的代碼就先不看了,看意思就是將原始ResultSet結(jié)果集轉(zhuǎn)化為list。

mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析

到此這篇關(guān)于mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換及查詢過(guò)程淺析的文章就介紹到這了,更多相關(guān)mybatis plus動(dòng)態(tài)數(shù)據(jù)源切換內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
性做久久久久久免费观看| 国产福利电影一区二区三区| 奇米777欧美一区二区| 亚洲精品四区| 亚洲视频 欧洲视频| 欧美xx69| 精品久久久久久久久久久久久久久 | 国产精品一品视频| 色88888久久久久久影院野外| 亚洲小少妇裸体bbw| 一区二区国产在线观看| 国产精品美日韩| 欧美黄色aaaa| 国产午夜亚洲精品午夜鲁丝片| 国产91富婆露脸刺激对白| 制服丝袜成人动漫| 国产呦精品一区二区三区网站| 欧美性色综合网| 久久精品国产亚洲a| 欧美亚洲国产bt| 精品一区二区三区视频在线观看| 欧美在线观看视频在线| 精品无人区卡一卡二卡三乱码免费卡| 欧美日韩国产在线观看| 国内精品久久久久影院薰衣草| 在线播放欧美女士性生活| 国内精品伊人久久久久影院对白| 欧美精品色一区二区三区| 男人的天堂亚洲一区| 欧美日韩一二区| 国产精品一品二品| 精品国产伦一区二区三区免费| 不卡一区在线观看| 国产色综合久久| 国产一区日韩欧美| 国产传媒日韩欧美成人| 欧美成人video| 欧美不卡福利| 亚洲欧美日韩国产手机在线 | 精品视频一区二区三区免费| 黄色日韩网站视频| 91精品国产综合久久精品麻豆| 精品在线观看免费| 91精品国产一区二区人妖| 波多野洁衣一区| 欧美国产日韩在线观看| 亚洲国产1区| 无码av中文一区二区三区桃花岛| 久久一本综合频道| 美国三级日本三级久久99| 欧美日韩中文字幕一区| 国产91丝袜在线播放0| 欧美va亚洲va国产综合| 色综合视频一区二区三区高清| 国产精品污污网站在线观看| 日韩亚洲视频在线| 午夜精品一区二区三区免费视频| 美女日韩在线中文字幕| 玖玖九九国产精品| 日韩亚洲欧美成人一区| 94色蜜桃网一区二区三区| 日韩一区在线播放| 噜噜噜躁狠狠躁狠狠精品视频| 国产真实乱子伦精品视频| 精品噜噜噜噜久久久久久久久试看| 欧美精品不卡| 午夜一区二区三区视频| 在线不卡中文字幕| 欧美成人蜜桃| 亚洲国产sm捆绑调教视频| 欧美午夜电影网| 国产成人精品免费网站| 国产精品入口麻豆九色| 久久本道综合色狠狠五月| 久久精品国产免费| 精品噜噜噜噜久久久久久久久试看| 精品动漫3d一区二区三区免费| 日韩不卡手机在线v区| 精品国产一二三| 亚洲精品国产系列| 久久99精品国产.久久久久久 | 亚洲免费综合| 国产99久久久精品| 亚洲人成电影网站色mp4| 日本乱人伦aⅴ精品| 成人高清视频免费观看| 亚洲精品国产成人久久av盗摄| 欧美色综合网站| 欧美在线播放| 秋霞电影一区二区| 国产三级欧美三级日产三级99| 亚洲一区在线直播| 国产福利一区二区三区视频在线| 国产精品欧美极品| 欧美日韩一本到| 伊伊综合在线| 国产一区二区三区| 亚洲欧美精品午睡沙发| 欧美酷刑日本凌虐凌虐| 欧美日韩在线一二三| 蜜臀av一级做a爰片久久| 国产欧美日韩精品一区| 欧美吞精做爰啪啪高潮| 欧美日韩网站| 老司机午夜精品| 国产精品久久久久久久午夜片| 欧洲一区二区三区免费视频| 欧美日韩一区二区高清| 美日韩一区二区三区| 欧美激情综合五月色丁香| 欧美在线一区二区三区| 精品不卡在线| 国产成人精品在线看| 亚洲成人av在线电影| 欧美精品一区二区三区在线播放 | 国产精品影音先锋| 亚洲女子a中天字幕| 日韩免费视频一区二区| 嫩草成人www欧美| 91麻豆成人久久精品二区三区| 精品一区二区三区的国产在线播放 | 亚洲女同在线| 亚洲欧美综合国产精品一区| 国产在线视频不卡二| 亚洲色图欧美激情| 日韩免费成人网| 欧美在线免费视屏| 国产日韩欧美二区| 99精品视频在线免费观看| 日本色综合中文字幕| 亚洲欧美另类小说| 国产日韩在线不卡| 日韩视频不卡中文| 色噜噜偷拍精品综合在线| 亚洲第一区色| 91丨九色丨黑人外教| 国产精品亚洲第一区在线暖暖韩国| 亚洲午夜久久久久中文字幕久| 国产精品污网站| 日韩精品一区二区三区swag| 欧美少妇bbb| 欧美亚洲三区| 日韩午夜在线电影| 国产精品jizz在线观看美国| 国产盗摄精品一区二区三区在线| 丝袜脚交一区二区| 亚洲免费在线看| 久久久99久久| 日韩一本二本av| 欧美精品黑人性xxxx| 91成人在线观看喷潮| 亚洲专区在线| 亚洲精品1区2区| 亚洲婷婷在线| 97久久精品人人澡人人爽| 国产成人免费视频一区| 精品在线你懂的| 蜜桃视频一区二区三区在线观看| 亚洲一区二区3| 一区二区三区中文免费| 国产精品天美传媒沈樵| 国产校园另类小说区| 精品国产人成亚洲区| 欧美一区二区国产| 欧美另类高清zo欧美| 欧美日韩高清在线| 欧美性xxxxxxxx| 欧美日韩精品三区| 欧美在线观看视频一区二区| 久久国产主播| 久久影院亚洲| 色综合久久九月婷婷色综合| 玖玖在线精品| 久久一区二区三区av| 米奇777在线欧美播放| 久久综合九色综合久99| 色哟哟一区二区三区| 91精品1区2区| 久久久水蜜桃| 色综合久久久久综合体 | 久久一区二区三区国产精品| 欧美精品一区二区蜜臀亚洲| 337p粉嫩大胆噜噜噜噜噜91av| 91精品国产黑色紧身裤美女| 日韩视频在线观看一区二区| 精品剧情在线观看| 精品va天堂亚洲国产| 国产欧美精品一区二区色综合| 国产视频一区二区在线观看| 国产精品你懂的| 亚洲人成网站在线| 亚洲激情在线激情| 亚洲国产欧美一区二区三区丁香婷| 一区二区三区在线视频免费观看| 亚洲精品国产精华液| 日韩中文字幕区一区有砖一区| 蜜臀国产一区二区三区在线播放| 精品亚洲成a人在线观看| 精品夜夜嗨av一区二区三区| 国产高清久久久|