日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring 多数据源- 原理

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring 多数据源- 原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近公司新開一個項目 需要整合多個數據源 在此記錄一下

1實現原理

利用spring 的AbstractRoutingDataSource? 抽象類 該類相當于數據源的路由中介 能在程序運行的過程中根據key 動態的指定使用數據源。

spring 源碼:

public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {};

1由此可以看出該類主要繼承?AbstractDataSource? 同時AbstractDataSource? 又是javax.sql.DataSource 的子類??

?2從AbstractRoutingDataSource 的getConnection()方法著手

? ? ? ?@Override
public Connection getConnection() throws SQLException {
return determineTargetDataSource().getConnection();
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return determineTargetDataSource().getConnection(username, password);

}

3 可以看出 主要使用determineTargetDataSource() 這個方法 這時候查看源碼?

????protected DataSource determineTargetDataSource() {
Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
Object lookupKey = determineCurrentLookupKey();
DataSource dataSource = this.resolvedDataSources.get(lookupKey);
if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
dataSource = this.resolvedDefaultDataSource;
}
if (dataSource == null) {
throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
}
return dataSource;

}

段源碼的重點在于determineCurrentLookupKey()方法,這是AbstractRoutingDataSource類中的一個抽象方法,而它的返回值是你所要用的數據源dataSource的key值,有了這個key值,resolvedDataSources(這是個map,由配置文件中設置好后存入的)就從中取出對應的DataSource,如果找不到,就用配置默認的數據源。

原理大致如下 這時候可以擴展AbstractRoutingDataSource類,并重寫其中的determineCurrentLookupKey()方法,來實現數據源的切換

下一篇 :?https://blog.csdn.net/lilongwangyamin/article/details/80505176 多數據源 實現

總結

以上是生活随笔為你收集整理的spring 多数据源- 原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。