searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

AbstractRoutingDatasource分析

2023-07-25 02:29:09
2
0

首先看一下的类结构

public abstract class AbstractRoutingDataSource extends AbstractDataSource {

    @Nullable
    private Map<Object, Object> targetDataSources;
 
    
    @Override
    public Connection getConnection() throws SQLException {
        return determineTargetDataSource().getConnection();
    }
 
    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;
    }
 
    
    protected abstract Object determineCurrentLookupKey();
 
}
 
AbstractRoutingDataSource继承了AbstractDataSource,而AbstractDataSource实现了DataSource.
AbstractRoutingDataSource实现了DataSource的getConnection方法,其中调用determineTargetDataSource
获取真正的DataSource.
关键是determineCurrentLookupKey,获取key,用来从targetDataSources这个map拿到对应的DataSource.
 
使用方式
定义一个类,继承AbstractRoutingDataSource,定义targetDataSources,并实现determineCurrentLookupKey.
一般通过ThreadLocal存储key,这样就可以完成一个可路由的数据源.
0条评论
作者已关闭评论
l****n
6文章数
0粉丝数
l****n
6 文章 | 0 粉丝
原创

AbstractRoutingDatasource分析

2023-07-25 02:29:09
2
0

首先看一下的类结构

public abstract class AbstractRoutingDataSource extends AbstractDataSource {

    @Nullable
    private Map<Object, Object> targetDataSources;
 
    
    @Override
    public Connection getConnection() throws SQLException {
        return determineTargetDataSource().getConnection();
    }
 
    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;
    }
 
    
    protected abstract Object determineCurrentLookupKey();
 
}
 
AbstractRoutingDataSource继承了AbstractDataSource,而AbstractDataSource实现了DataSource.
AbstractRoutingDataSource实现了DataSource的getConnection方法,其中调用determineTargetDataSource
获取真正的DataSource.
关键是determineCurrentLookupKey,获取key,用来从targetDataSources这个map拿到对应的DataSource.
 
使用方式
定义一个类,继承AbstractRoutingDataSource,定义targetDataSources,并实现determineCurrentLookupKey.
一般通过ThreadLocal存储key,这样就可以完成一个可路由的数据源.
文章来自个人专栏
微服务1
6 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0