jdbcTemplate使用spring動(dòng)態(tài)數(shù)據(jù)源配置時(shí)的問題

首先理解下什么是數(shù)據(jù)源,其實(shí)就是一個(gè)描述一個(gè)數(shù)據(jù)庫連接的各個(gè)參數(shù),并提供獲取連接的方法,在javax包中,又對應(yīng)的接口javax.sql.DataSource,打開源碼可以看到有兩個(gè)方法

public interfaceDataSourceextendsCommonDataSource,Wrapper {

?Connection getConnection()throwsSQLException;

?Connection getConnection(String username,String password) throwsSQLException;

}

在網(wǎng)絡(luò)已經(jīng)有文章使用spring配置動(dòng)態(tài)數(shù)據(jù)源,關(guān)鍵類是AbstractRoutingDataSource,

在實(shí)現(xiàn)getConnection時(shí),調(diào)用一個(gè)關(guān)鍵方法determineTargetDataSource,這個(gè)方法就用來實(shí)現(xiàn)決定數(shù)據(jù)源的邏輯,而我們是需要實(shí)現(xiàn)determineCurrentLookupKey方法即可。

但是在使用jdbcTemplate使用動(dòng)態(tài)數(shù)據(jù)源時(shí)發(fā)現(xiàn)一個(gè)問題,就是只能切換到第一個(gè)數(shù)據(jù)源,其他配置的獲取不到,就是沒有實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源的效果,翻看源碼會發(fā)現(xiàn)jdbcTemplate會使用DataSourceUtils.getConnection,然后調(diào)用dodoGetConnection獲取連接,源碼為



可以看到有個(gè)map,這個(gè)是和線程綁定的。而這個(gè)map是HashMap,所以我們實(shí)現(xiàn)的數(shù)據(jù)源,并沒有每次調(diào)用getConnection方法。知道是HashMap也就知道怎么解決了,就是重寫hashCode方法,所以在實(shí)現(xiàn)AbstractRoutingDataSource類時(shí),重寫hashCode方法就可以了,比如這樣


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,836評論 0 11
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,671評論 1 114
  • 如果說時(shí)光是一指流沙,那你的人生便是這顆顆細(xì)沙堆積成的沙堆。它可能會越堆越高,但也可能經(jīng)不住狂風(fēng)吹吼,一陣風(fēng)刮過,...
    淑琦記閱讀 2,066評論 0 1
  • 當(dāng)你有意讀完這篇文章的時(shí)候,說明你已經(jīng)知道YouCompleteMe的神奇了。我的系統(tǒng)是Ubuntu,語言是Pyt...
    簡訊Alfred閱讀 1,997評論 2 3