首先理解下什么是數(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方法就可以了,比如這樣