在Spring中动态初始化多个数据源

在Spring中动态初始化多个数据源,spring,routing,datasource,Spring,Routing,Datasource,在我的spring应用程序中,我需要根据应用程序配置中设置的一些值动态初始化多个数据源。 我知道SpringJDBC库提供的AbstractRoutingDataSource类,但它只有在您需要一次基于单个查找键值初始化单个数据源时才有用 是否可以扩展AbstractRoutingDataSource并更改其行为以支持多键查找和数据源解析?还有其他的替代方法吗 基本上,我正试图通过AbstractDataSourceOuter类实现如下目标: public class DataSourceRou

在我的spring应用程序中,我需要根据应用程序配置中设置的一些值动态初始化多个数据源。 我知道SpringJDBC库提供的AbstractRoutingDataSource类,但它只有在您需要一次基于单个查找键值初始化单个数据源时才有用

是否可以扩展AbstractRoutingDataSource并更改其行为以支持多键查找和数据源解析?还有其他的替代方法吗

基本上,我正试图通过AbstractDataSourceOuter类实现如下目标:

public class DataSourceRouter extends AbstractRoutingDataSource {


@Value("${com.listdb.datasource.switch}")
private short listDBSwitch;

@Value("${com.scoringdb.datasource.switch}")
private short scoringDbSwitch;

@Value("${com.configmaster.datasource.switch}")
private short configDbSwitch;


private List<String> configuredDataSources;
/**
 * Determine the current lookup key. This will typically be
 * implemented to check a thread-bound transaction context.
 * <p>Allows for arbitrary keys. The returned key needs
 * to match the stored lookup key type, as resolved by the
 * {@link #resolveSpecifiedLookupKey} method.
 */
@Override
protected Object determineCurrentLookupKey() {

    if(ListUtil.isListNotEmpty(configuredDataSources)) {

        configuredDataSources =new ArrayList<String>();


        String listDBString = (listDBSwitch == 1)?DataSources.LIST.toString() : null;
        String configDBString = (configDbSwitch == 1) ? DataSources.CONFIGMASTER.toString() :null;
        String scoringDBString = (scoringDbSwitch == 1) ? DataSources.SCORING.toString() : null;

        /**
         * Add all configured data source keys for look up
         */
        configuredDataSources.add(listDBString);
        configuredDataSources.add(configDBString);
        configuredDataSources.add(scoringDBString);

    }

    return configuredDataSources;
}
公共类数据源外部扩展AbstractRoutingDataSource{
@值(${com.listdb.datasource.switch}”)
私有短消息交换;
@值(${com.scoringdb.datasource.switch}”)
私人短视;
@值(${com.configmaster.datasource.switch}”)
专用短交换机;
私有列表配置数据源;
/**
*确定当前查找键。这通常是
*实现以检查线程绑定的事务上下文。
*允许任意密钥。返回的密钥需要
*匹配存储的查找键类型,由
*{@link#resolveSpecifiedLookupKey}方法。
*/
@凌驾
受保护的对象确定当前查找键(){
if(ListUtil.isListNotEmpty(configuredDataSources)){
configuredDataSources=newArrayList();
字符串listDBString=(listDBSwitch==1)?DataSources.LIST.toString():null;
字符串configDBString=(configDbSwitch==1)?DataSources.CONFIGMASTER.toString():null;
字符串scoringDBString=(scoringDbSwitch==1)?DataSources.SCORING.toString():null;
/**
*为查找添加所有配置的数据源密钥
*/
configuredDataSources.add(listdString);
configuredDataSources.add(configDBString);
configuredDataSources.add(scoringDBString);
}
返回配置的数据源;
}
}


有什么帮助/建议吗?

这在当前的spring/hibernate版本中是不可能的,即使这样做很好。如果您需要多个数据源并使用AbstractRoutingDataSource来实现这一点,那么一个可能的解决方案是让spring初始化一个DB(默认/配置DB),并添加例如init.sql脚本(或者flyway/liquibase,如果您更喜欢该脚本)来初始化同一AbstractRoutingDataSource下的所有其他数据库


这种方法工作得很好,可以让您更好地控制(希望是测试!)环境。就我个人而言,我喜欢比任何自动初始化器都能提供更多的对DB模式的控制,然而这只是一个品味/风格问题

这在当前的spring/hibernate版本中是不可能的,即使这样做很好。如果您需要多个数据源并使用AbstractRoutingDataSource来实现这一点,那么一个可能的解决方案是让spring初始化一个DB(默认/配置DB),并添加例如init.sql脚本(或者flyway/liquibase,如果您更喜欢该脚本)来初始化同一AbstractRoutingDataSource下的所有其他数据库

这种方法工作得很好,可以让您更好地控制(希望是测试!)环境。就我个人而言,我喜欢比任何自动初始化器都能提供更多的对DB模式的控制,然而这只是一个品味/风格问题