最近公司新开一个项目 需要整合多个数据源 在此记录一下
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 多数据源 实现