1 ExceptionSorter&ValidConnectionChecker
ExceptionSorter&ValidConnectionChecker 都是com.alibaba.druid.pool.vendor包下面的組件辨萍,
這篇應(yīng)該是pool包的最后一篇了俯萌,看一下mysql下典型實(shí)現(xiàn)的類圖:
關(guān)系都比較簡(jiǎn)單痴颊,都是對(duì)應(yīng)各種不通數(shù)據(jù)庫(kù)的實(shí)現(xiàn)搓侄。
2 ValidConnectionChecker
ValidConnectionChecker是在dataSource中的init()->initValidConnectionChecker()方法中初始化马僻,根據(jù)DriverClass生成相應(yīng)數(shù)據(jù)庫(kù)的checker,調(diào)用的話在validateConnection和testConnectionInternal兩個(gè)方法中
- validateConnection 在createPhysicalConnection和shrink中調(diào)用(shrink是縮小連接池時(shí)揪漩,發(fā)現(xiàn)連接不可用直接廢棄)
- testConnectionInternal在遇到testWhileIdle畜眨,testOnBorrow,testOnReturn時(shí)會(huì)調(diào)用泛鸟,驗(yàn)證連接的有效性蝠咆;
如果有相關(guān)數(shù)據(jù)庫(kù)的ValidConnectionChecker,則使用ValidConnectionChecker驗(yàn)證
如果沒(méi)有ValidConnectionChecker谈况,則直接使用validationQuery驗(yàn)證勺美;MySqlValidConnectionChecker會(huì)使用Mysql獨(dú)有的ping方式進(jìn)行驗(yàn)證,其他數(shù)據(jù)庫(kù)其實(shí)也都是使用validationQuery進(jìn)行驗(yàn)證
3 ExceptionSorter
官方對(duì)于這些ExceptionSorter的作用是這么定義的:
當(dāng)網(wǎng)絡(luò)斷開(kāi)或者數(shù)據(jù)庫(kù)服務(wù)器Crash時(shí)碑韵,連接池里面會(huì)存在“不可用連接”赡茸,連接池需要一種機(jī)制剔除這些“不可用連接”。在Druid和JBoss連接池中祝闻,剔除“不可用連接”的機(jī)制稱為ExceptionSorter占卧,實(shí)現(xiàn)的原理是根據(jù)異常類型/Code/Reason/Message來(lái)識(shí)別“不可用連接”。沒(méi)有類似ExceptionSorter的連接池联喘,在數(shù)據(jù)庫(kù)重啟或者網(wǎng)絡(luò)中斷之后华蜒,不能恢復(fù)工作,所以ExceptionSorter是連接池是否穩(wěn)定的重要標(biāo)志豁遭。
具體調(diào)用是在Connection異常發(fā)生時(shí)叭喜,最后都會(huì)落到DruidDataSource的handleConnectionException方法,主要就是判斷是否Fatal error蓖谢,不是就繼續(xù)往外拋異常捂蕴,是的話,就調(diào)用handleFatalError闪幽,最終把連接物理關(guān)閉
4 總結(jié)
本篇主要是driud對(duì)于異常的判斷和處理的流程總結(jié)啥辨,是init()中的一些細(xì)節(jié)的補(bǔ)充;
由于遠(yuǎn)程IO連接的特性盯腌,不能在連接一有異常的時(shí)候溉知,系統(tǒng)就能感知到,所以用了上述方式去處理,在業(yè)務(wù)中也是值得借鑒的级乍,即:
- 對(duì)于異常的診斷與處理解耦
- 異常的處理可以按異常等級(jí)的劃分舌劳,同過(guò)異常傳遞機(jī)制,分別處理