日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mybatisplus執(zhí)行查詢過程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久久久久av公交车| 日韩精品一区第一页| 亚洲影视一区二区三区| 中文字幕成人| 国产欧美一区二区色老头| 美女在线视频一区| bbw在线视频| 99香蕉国产精品偷在线观看| 日韩中文字幕91| 日本va欧美va欧美va精品| 国产精品高清一区二区| 日韩和的一区二在线| 中文国产一区| 国产精选久久| 蜜桃成人精品| 午夜亚洲福利| 免费日韩一区二区三区| 欧洲在线一区| 日本a口亚洲| 免费污视频在线一区| 亚洲精品欧美| 天堂av在线| 丝袜美腿一区二区三区| 卡一卡二国产精品| 国产综合亚洲精品一区二| 日韩高清在线不卡| 日韩伦理在线一区| 日本在线成人| 91精品韩国| 日韩激情一区二区| av在线最新| 中文字幕av一区二区三区四区| 久久精品国产成人一区二区三区| 在线日韩电影| 国产精品调教视频| 五月天综合网站| 国产精品成人自拍| 国产一区91| 福利视频一区| 日本精品在线播放| 免费毛片在线不卡| 高清一区二区| 日韩av在线播放中文字幕| 久久精品国产大片免费观看| 国产精品一区二区三区av麻| 亚洲欧美日本国产专区一区| 麻豆成人av在线| 免播放器亚洲| 日韩免费福利视频| 国产精品午夜av| 国产精品毛片在线| 亚洲一级少妇| 精品在线网站观看| 日韩福利视频网| 久久高清国产| 欧美1区2区3区| 黄毛片在线观看| 国产精品视频首页| 亚洲精品美女91| 国产精品腿扒开做爽爽爽挤奶网站| 欧美国产美女| 国产精品白丝久久av网站| 亚洲青青久久| 国产精品日韩| 婷婷色综合网| 久久要要av| 黑人精品一区| 国产一区二区精品久| 国产精品久久久久久妇女| 日韩高清电影一区| 免费观看在线色综合| 精品在线99| 亚洲综合在线电影| 国产精品成人a在线观看| 国产精品片aa在线观看| 午夜久久av | 久久99伊人| 999国产精品视频| 国产suv精品一区二区四区视频| 久久国产精品色av免费看| 亚洲精选成人| 日韩在线成人| 欧美永久精品| 国产精品主播| 久久国内精品| 国产精品黄色片| 久久精品国产999大香线蕉| 欧美黄色一区| 动漫av一区| 日韩在线观看| 欧美日韩在线二区| 91精品99| 中文字幕av亚洲精品一部二部| 亚洲深夜福利在线观看| 综合国产精品| 青青草国产精品亚洲专区无| 国产日韩欧美| 国产aa精品| 国产一区观看| 亚洲精品电影| 亚洲精品国模| 国产精品久久777777毛茸茸| 精品国产鲁一鲁****| 日本在线啊啊| 亚洲女同中文字幕| 综合一区在线| 欧美aⅴ一区二区三区视频| 成人片免费看| 亚洲精品123区| 日韩三级视频| 精品三级在线观看视频| 日韩欧美视频专区| 在线一区视频| 青草av.久久免费一区| 久久精品超碰| 亚洲三级欧美| 丝瓜av网站精品一区二区| 久久精品xxxxx| 日本蜜桃在线观看视频| 亚洲香蕉网站| 日韩一区二区三区四区五区| 免费在线亚洲欧美| 亚洲福利国产| 日韩av不卡一区二区| 国产一区二区三区四区五区| 婷婷丁香综合| 国产精品亚洲产品| 久久久久久久久99精品大| 免费国产亚洲视频| 国产伦理久久久久久妇女| 中文字幕人成乱码在线观看| 99亚洲精品| 久久香蕉精品香蕉| 在线视频亚洲| 精品视频在线一区二区在线| 亚洲成人日韩| 欧美91在线| 免费在线观看视频一区| 国内自拍视频一区二区三区| 日韩午夜一区| 久久亚洲国产精品尤物| 夜久久久久久| 九九九精品视频| 视频一区视频二区中文| 精品一区不卡| 一区二区三区国产在线| 中文字幕人成乱码在线观看| 亚洲精品韩国| 在线成人动漫av| 精品三级在线| 日韩精品导航| 99视频一区| jizzjizz中国精品麻豆| 欧美日本久久| 免费日韩av片| 欧美精品高清| 老司机精品视频在线播放| 亚洲精品影视| 亚洲一级二级| 欧美极品中文字幕| 巨乳诱惑日韩免费av| 欧美精品高清| 久久免费视频66| 亚洲精品免费观看| 91精品电影| 日韩电影免费网址| 麻豆精品少妇| 国产亚洲精品美女久久| 蜜桃91丨九色丨蝌蚪91桃色| 久久中文字幕av一区二区不卡| 国产精品激情电影| 日韩高清在线不卡| 亚洲综合日韩| 婷婷激情久久| 国产成人77亚洲精品www| 久久国产精品免费精品3p| 爽爽淫人综合网网站 | 亚洲涩涩在线| 麻豆精品新av中文字幕| 欧美一区不卡| 日韩国产一二三区| 亚洲精一区二区三区| 国产精品免费看| 欧美日韩国产一区二区三区不卡| 国产成人精品一区二区三区免费| 国产欧美69| 欧美在线看片| 日韩和欧美一区二区三区| 亚洲一区欧美激情| 在线国产一区| 婷婷综合在线| 蜜桃tv一区二区三区| 久久婷婷激情| 久久精品成人| 香蕉久久精品| 免费黄色成人| 欧美日韩日本国产亚洲在线| 午夜视频精品| 亚洲免费一区二区| 亚洲一级淫片|