亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2020年12月25日 16:27:23   作者:程序源程序  
這篇文章主要介紹了mybatis plus動態(tài)數(shù)據(jù)源切換及查詢過程淺析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

mybatis plus多數(shù)據(jù)源切換

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

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

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

在這里插入圖片描述

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

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

mybatisplus執(zhí)行查詢過程

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

在這里插入圖片描述

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

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

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

在這里插入圖片描述

在這里插入圖片描述

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

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

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

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

在這里插入圖片描述

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

相關文章

  • java刪除文件夾下所有文件示例分享

    java刪除文件夾下所有文件示例分享

    這篇文章主要介紹了java刪除文件夾下所有文件示例,需要的朋友可以參考下
    2014-02-02
  • 基于Java字符串 "==" 與 "equals" 的深入理解

    基于Java字符串 "==" 與 "equals" 的深入理解

    本篇文章是對Java中的字符串"=="與"equals"進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Javaweb獲取表單數(shù)據(jù)的多種方式

    Javaweb獲取表單數(shù)據(jù)的多種方式

    這篇文章主要為大家詳細介紹了Javaweb獲取表單數(shù)據(jù)的多種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Spring Boot Admin 進行項目監(jiān)控管理的方法

    Spring Boot Admin 進行項目監(jiān)控管理的方法

    Spring Boot Admin是一個開源社區(qū)項目,用于管理和監(jiān)控SpringBoot應用程序。 這篇文章主要介紹了 Spring Boot Admin 進行項目監(jiān)控管理的方法,需要的朋友可以參考下
    2020-07-07
  • Java經(jīng)典面試題最全匯總208道(六)

    Java經(jīng)典面試題最全匯總208道(六)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(六),本文章內(nèi)容詳細,該模塊分為了六個部分,本次為第六部分,需要的朋友可以參考下
    2023-01-01
  • 針對Dubbo接口Mock的解決方案詳解

    針對Dubbo接口Mock的解決方案詳解

    這篇文章主要為大家介紹了針對Dubbo接口Mock的解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java使用icepdf將pdf文件按頁轉成圖片

    Java使用icepdf將pdf文件按頁轉成圖片

    這篇文章主要為大家詳細介紹了Java使用icepdf將pdf文件按頁轉成圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Java Arrays工具類用法詳解

    Java Arrays工具類用法詳解

    這篇文章主要介紹了Java Arrays工具類用法,結合實例形式分析了java Arrays工具類針對數(shù)組元素修改、復制、排序等操作使用技巧與相關注意事項,需要的朋友可以參考下
    2019-05-05
  • Spring Boot 日志配置方法(超詳細)

    Spring Boot 日志配置方法(超詳細)

    默認情況下,Spring Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺。下面通過本文給大家介紹Spring Boot 日志配置方法詳解,感興趣的朋友參考下吧
    2017-07-07
  • Java數(shù)據(jù)結構之對象比較詳解

    Java數(shù)據(jù)結構之對象比較詳解

    這篇文章主要為大家詳細介紹了Java中對象的比較、集合框架中PriorityQueue的比較方式以及PriorityQueue的模擬實現(xiàn),感興趣的可以了解一下
    2022-07-07

最新評論