最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于@DS注解切換數(shù)據(jù)源失敗的原因?qū)崙?zhàn)記錄

 更新時間:2023年05月11日 08:43:08   作者:胡小妹滴陳小鈿  
項目配置了多個數(shù)據(jù)源,需要使用@DS注解來切換數(shù)據(jù)源,但是卻遇到了問題,下面這篇文章主要給大家介紹了關(guān)于@DS注解切換數(shù)據(jù)源失敗原因的相關(guān)資料,需要的朋友可以參考下

項目場景:

一位好友在陳年老代碼中想要加入mybatis-plus和boumidou的多數(shù)據(jù)源來輕松實現(xiàn)crud,但是發(fā)現(xiàn)@DS無法成功切換數(shù)據(jù)源,一直都是訪問的主庫,于是我開始了漫長的啃源碼找原因。

以下內(nèi)容包含兩個問題1:配置的數(shù)據(jù)庫沒有正常被dynamic框架載入,2:@DS注解切換數(shù)據(jù)源無效

問題排查過程

第一個問題,數(shù)據(jù)源沒有載入

根據(jù)啟動日志里druid打印的信息來看,只載入了一個數(shù)據(jù)庫,并沒有把yml配置信息中的兩個數(shù)據(jù)庫都加載,YML配置如下。

 從源碼來看,數(shù)據(jù)源的配置讀取是在AbstractDataSourceProvider類中。

 他的調(diào)用是在子類YmlDynamicDataSourceProvider中。

然后在DynamicDataSourceAutoConfiguration類中注入了YmlDynamicDataSourceProvider。

 在此處打上斷點后,發(fā)現(xiàn)傳入的datasourceMap中的信息都是正確的,跟yml配置的一致。

 那就只能是YmlDynamicDataSourceProvider中的loadDataSources()方法沒有調(diào)用。

此方法在DynamicRoutingDataSource的初始化方法中調(diào)用。

在這里打上斷點后發(fā)現(xiàn)斷點進不來,是對象沒有創(chuàng)建的原因,回到DynamicDataSourceAutoConfiguration類中找DynamicRoutingDataSource的創(chuàng)建。

@ConditionalOnMissingBean表明dataSource這個Bean應(yīng)該是已經(jīng)被注入了,通過全局查詢找到了問題的關(guān)鍵點(下圖),代碼在其他地方注入了dataSource。

 然而很多地方已經(jīng)在用這個dataSource了,刪了的話,就雪崩了。考慮另辟蹊徑,選擇了自己去創(chuàng)建DynamicRoutingDataSource對象。

 到這里,成功載入了其他數(shù)據(jù)源。

第二個問題,@DS注解切換數(shù)據(jù)源無效

先從@DS的攔截盤起,@DS的攔截在DynamicDataSourceAnnotationInterceptor攔截器中,讀取了@DS上的庫名,然后放入一個上下文管理器的隊列中。

調(diào)用SQL時,會通過AbstractRoutingDataSource的getConnection()方法(下圖)。

里面的determineDataSource()方法由子類DynamicRoutingDataSource實現(xiàn),真正切換了數(shù)據(jù)源,里面調(diào)用了隊列的peek()方法,取出上面攔截器中加入的@DS屬性的庫名,然后通過庫名,拿到了對應(yīng)數(shù)據(jù)源的DataSource,再結(jié)合AbstractRoutingDataSource的getConnection()方法拿到了對應(yīng)數(shù)據(jù)庫的連接,去執(zhí)行SQL。

切換數(shù)據(jù)源的流程到這就說的差不多了,然后講講這個項目中為什么切換不了數(shù)據(jù)源。

在determineDataSource()方法打上斷點,結(jié)果根本沒有經(jīng)過該方法,然而@DS的攔截器斷點是能正常進入的,@DS注解上的數(shù)據(jù)源名稱也讀取正確,是第二個庫。由此猜測,應(yīng)該是沒有走進AbstractRoutingDataSource的getConnection()方法,查看druid的數(shù)據(jù)庫加載相關(guān)的日志,發(fā)現(xiàn)在boumidou的dynamic框架加載數(shù)據(jù)庫之前,已經(jīng)有其他數(shù)據(jù)庫加載了。

 推測可能是由于,SQL調(diào)用的時候,默認(rèn)是用的第一個數(shù)據(jù)庫的DataSource調(diào)用的getConnection()方法,但是這個不是由dynamic框架加載,并不是AbstractRoutingDataSource對象,所以不會走進determineDataSource()方法去選擇數(shù)據(jù)源,就試著想辦法讓dynamic框架優(yōu)先加載。

 在上面自己創(chuàng)建DynamicRoutingDataSource的@Bean方法上,加上了@Primary注解,去掉了引起問題一的方法上的@Primary注解,來讓多數(shù)據(jù)源優(yōu)先加載。

然后就成功了,也能通過@DS正常切換數(shù)據(jù)源了。

總結(jié)

到此這篇關(guān)于關(guān)于@DS注解切換數(shù)據(jù)源失敗的原因的文章就介紹到這了,更多相關(guān)@DS注解切換數(shù)據(jù)源失敗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

海安县| 罗城| 城步| 故城县| 武陟县| 荔波县| 合阳县| 旬邑县| 秭归县| 奉贤区| 白水县| 和龙市| 化隆| 扶风县| 县级市| 娱乐| 丰原市| 镇远县| 唐海县| 焦作市| 汉川市| 遵化市| 桦甸市| 马鞍山市| 会理县| 通渭县| 宁阳县| 甘谷县| 宝应县| 嘉兴市| 长沙县| 平安县| 广平县| 宝应县| 巴彦淖尔市| 新平| 司法| 会东县| 蒙城县| 东乡族自治县| 湘潭县|