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

时间:2016-04-28 11:10:37

标签: spring routing datasource

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

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

基本上我试图通过AbstractDataSourceRouter类实现类似的东西:

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;
}

}

任何帮助/建议?

1 个答案:

答案 0 :(得分:0)

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

这种方法运行良好,让您可以更好地控制您的(希望测试!)环境。我个人喜欢对DB模式有更多的控制权,然后任何自动初始化程序都可以提供,但这只是一个品味/风格问题。