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 多数据源- 原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi中的指针与C类似
- 下一篇: 【数据结构与算法】浅谈队列的应用