抽象类AbstractRoutingDataSource
,通过扩展这个类实现根据不同的请求切换数据源。
AbstractRoutingDataSource
继承AbstractDataSource
,如果声明一个类DynamicDataSource
继承AbstractRoutingDataSource
后,DynamicDataSource
本身就相当于一种数据源。所以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);
}
而AbstractRoutingDataSource
的getConnection()
方法里实际是调用determineTargetDataSource()
返回的数据源的getConnection()
方法。接着看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()
方法获取一个key,通过key从resolvedDataSources
中获取数据源DataSource
对象。determineCurrentLookupKey()
是个抽象方法,需要继承AbstractRoutingDataSource
的类实现;而resolvedDataSources
是一个Map<Object, DataSource>
,里面应该保存当前所有可切换的数据源。
网友评论