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

您的位置:首頁技術文章
文章詳情頁

mybatis plus動態數據源切換及查詢過程淺析

瀏覽:250日期:2023-10-20 15:08:41
mybatis plus多數據源切換

mybatis plus多數據源切換使用注解 @DSDS注解作為多數據源切點,具體實現作用主要由兩個類完成DynamicDataSourceAnnotationAdvisorDynamicDataSourceAnnotationInterceptor

DS多數據源切換實現

1.DynamicDataSourceAnnotationAdvisor類實現切面配置,其中AnnotationMatchingPointcut用于尋找切點,進入可看到支持類和方法的切點,多個切點會執行多次,根據代碼順序,方法的切點執行晚于類切點,所以方法的切點會覆蓋類,但是都會被執行

mybatis plus動態數據源切換及查詢過程淺析

mybatis plus動態數據源切換及查詢過程淺析

2.DynamicDataSourceAnnotationInterceptor 實現切面功能,匹配到切點后,根據切點值(數據源id)設置當前線程有效數據源私有變量,用于執行查詢時動態數據源能獲取,執行完畢會清楚此變量,此存儲功能由DynamicDataSourceContextHolder提供

mybatis plus動態數據源切換及查詢過程淺析

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

mybatis plus動態數據源切換及查詢過程淺析

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

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

mybatis plus動態數據源切換及查詢過程淺析

5.主要邏輯已經清楚了,那么來延伸下,如何手動切換數據源mybatisplus切換數據源主要是使用DynamicDataSourceContextHolder的線程獨享變量,那么如果沒有DS切點,無法自動切換數據源,需要切換數據源時就可以使用DynamicDataSourceContextHolder.setDataSourceLookupKey 設置數據源,使用完后再清除掉(默認數據源生效),這個方法同第4步所提的事務問題,存在事務則無法切換(壓根就不執行 只設置無法執行切換代碼),如果將要執行的代碼已存在切點,則執行前手動設置也是無效的,因為切點會覆蓋你的設置。

注:如果需要在事務存在的情況下切換數據源,則估計要覆蓋掉或替換掉spring的事務管理器,此處待后續再議。如果事務內仍需要切換數據源,則需要單獨定義service并設置切點,設置此切點的事務傳播行為為PROPAGATION__REQUIRES_NEW,則執行切面方法時單獨創建一個事務,數據源會自動切換。

mybatisplus執行查詢過程

現分析mybatisplus執行查詢過程

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

可以看到此處提供多種返回值的查詢,有空返回值,多個,map,游標,及啥也不是??罩挡樵儾聹y是另有處理器直接處理返回值,此處不做延伸了,有需要再議,回到按照ID查詢及進入啥也不是分支,本次查詢不是分頁查詢,直接進入selectOne ,result = sqlSession.selectOne(this.command.getName(), param); 這里的sqlSession是SqlSessionTemplate,執行selectOne時首先獲取sqlSession(默認為DefaultSelSession)

mybatis plus動態數據源切換及查詢過程淺析

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

mybatis plus動態數據源切換及查詢過程淺析

mybatis plus動態數據源切換及查詢過程淺析

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

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

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

mybatis plus動態數據源切換及查詢過程淺析

mybatis plus動態數據源切換及查詢過程淺析

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

創建完Statement后就會執行查詢,先看來看Statement如何創建

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

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

mybatis plus動態數據源切換及查詢過程淺析

到此這篇關于mybatis plus動態數據源切換及查詢過程淺析的文章就介紹到這了,更多相關mybatis plus動態數據源切換內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
黄页网站一区| 亚洲一级在线| 日韩av午夜在线观看| 蜜臀av亚洲一区中文字幕| 亚洲综合三区| 蜜桃久久久久久| 日韩影片在线观看| 久久国产视频网| 麻豆成人在线观看| 国产一区精品福利| 久久久国产精品网站| 激情综合婷婷| 蜜臀国产一区| 在线日韩一区| 亚洲欧美日本视频在线观看| 免费不卡在线视频| 久久精品国产久精国产| 日韩在线综合| 视频在线在亚洲| 国产精品videossex| 国产美女高潮在线| 丝袜亚洲精品中文字幕一区| 91亚洲精品视频在线观看 | 国产欧美一区二区三区国产幕精品| 麻豆视频久久| 亚洲精品国产偷自在线观看| 日本不卡高清| 久久久久久久久久久妇女| 另类av一区二区| 福利精品一区| 一本一道久久a久久精品蜜桃| 日韩av成人高清| 999国产精品999久久久久久| 亚洲精品看片| 国产亚洲一区二区手机在线观看| 乱人伦精品视频在线观看| 国产精品久久久免费| 久久久精品午夜少妇| 亚州av乱码久久精品蜜桃| 国产精品v一区二区三区| 亚洲美洲欧洲综合国产一区| 欧美国产极品| 91精品啪在线观看国产爱臀| 国产一区久久| 粉嫩av一区二区三区四区五区| 蜜臀久久99精品久久久久久9| 日本激情一区| 国产精品一国产精品| 亚洲欧美视频一区二区三区| 国产高潮在线| 牛牛精品成人免费视频| 视频一区免费在线观看| 福利一区和二区| 国产精品成人3p一区二区三区| 中文在线一区| 99精品99| 欧美1区免费| 黑森林国产精品av| 久久精品免视看国产成人| 日本免费新一区视频| 午夜宅男久久久| 亚洲欧美日韩专区| 亚洲影院天堂中文av色| 免费国产自久久久久三四区久久| 日韩不卡免费高清视频| 日本а中文在线天堂| 成人日韩在线观看| 91嫩草亚洲精品| 精品一区二区三区在线观看视频 | 99视频在线精品国自产拍免费观看| 国产在线一区不卡| 偷拍精品精品一区二区三区| 国产91精品对白在线播放| 伊人精品视频| 日韩二区三区在线观看| 国产日韩视频| 久久久久久久欧美精品| 最近国产精品视频| 青青国产精品| 亚洲黄色中文字幕| 久久成人国产| 精品一二三区| 亚洲高清av| 免费日韩一区二区| 国产精久久一区二区| 啪啪国产精品| 免费日韩视频| 国内精品麻豆美女在线播放视频| 韩日一区二区三区| 色8久久久久| 国产精品视频一区二区三区综合 | 电影天堂国产精品| 日韩在线成人| 秋霞影视一区二区三区| 日本视频中文字幕一区二区三区| 91偷拍一区二区三区精品| 久久亚洲一区| 中文字幕成在线观看| 免费久久99精品国产| 日本黄色精品| 国产亚洲精品v| 国产欧美日韩免费观看| 亚洲一级影院| 乱一区二区av| 亚洲综合小说| 国产精品97| 日韩中文欧美| 国产亚洲精品精品国产亚洲综合| 国内精品福利| 伊人久久视频| 麻豆精品久久久| 日本va欧美va瓶| 国产亚洲福利| 99亚洲精品| 亚洲一级网站| 日韩在线短视频| 国产精品男女| 日本精品久久| 日韩在线成人| 日韩久久99| 亚洲免费观看高清完整版在线观| 亚洲91精品| 蜜桃av.网站在线观看| 国产精品二区不卡| 国产videos久久| 激情中国色综合| 国内不卡的一区二区三区中文字幕| 国产乱码精品一区二区三区亚洲人 | 蜜桃av.网站在线观看| 久久久久久一区二区| 91精品韩国| 中文字幕日本一区| 久久久久伊人| 欧美aa在线观看| 在线亚洲精品| 欧美影院精品| 国产乱码午夜在线视频| 亚洲爱爱视频| 亚洲一区二区三区在线免费| 91福利精品在线观看| 国产精品久久久久久久久久妞妞 | 日本欧美一区| 成人小电影网站| 婷婷亚洲精品| 成人在线免费观看91| 影音先锋久久| 国产精品极品国产中出| 亚洲精品小说| 欧美亚洲免费| 日韩午夜一区| 欧美国产先锋| 蜜臀91精品一区二区三区| 婷婷综合成人| 日韩视频中文| 97se综合| 国产欧美69| 一二三区精品| 午夜宅男久久久| 久久一级电影| 在线亚洲人成| 久久免费影院| 国产精品亚洲二区| 一区二区三区四区日韩| 欧美黄色网页| 97精品国产一区二区三区| 国产福利一区二区三区在线播放| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩免费看片| 91综合久久爱com| 日韩和欧美一区二区| 亚洲欧美日韩精品一区二区 | 亚洲不卡系列| 国产成人1区| 精品国产a一区二区三区v免费| 日本aⅴ精品一区二区三区| 热久久免费视频| 中文不卡在线| 中文字幕亚洲在线观看| 在线综合欧美| 亚洲精品高潮| 欧美一区精品| 综合激情在线| 欧美一区91| 牛牛精品成人免费视频| 精品少妇av| 精品中文在线| av在线最新| 成人精品亚洲| 模特精品在线| 日本午夜精品视频在线观看| 欧美久久一区二区三区| 国产亚洲字幕| 中文字幕在线官网| 一区二区三区四区在线看| 亚洲在线成人| 日本天堂一区| 福利一区和二区| 影音先锋国产精品| 国产欧美自拍| 国产不卡人人|