SSH下,关于多数据库的两个问题。

1.多数据源切换
现在能够实现的是两个写死的数据库中间可以切换,如果是想要其中一个数据库链接地址是动态获取的话,该如何操作呢?比方说A数据库写死的,B数据库的字符串链接地址从A数据库里面的某张表获取后链接访问
2.多数据库分发,类似一个数据库投递中转站,A数据发送到B数据库里面,然后根据ID找到相对应的数据库链接,分发投递数据。

PS:全部积分,以上两个问题已经滞留了2个月,没有找到合适的解决办法。大神有相关经验的可以回答下,最好有相关事例或者链接参考。全天在线,随时请教。

这个就是先默认加载主数据源,然后根据需要动态创建bean,加载需要的数据源,需要时根据传入的数据源别名进行加载

附上当时写的部分代码,我当时的需求是做数据可视化,但是数据分布在十多个数据库中,我在主库维护了其他所有数据库的信息,根据数据的来源加载不同的数据库从而展现需要的数据
/**
* 注册数据源
* @author liuqiang
*/
private void registerBeanDefinitions(){
Map targetDataSources = new HashMap();
// 将主数据源添加到更多数据源中
targetDataSources.put(ddsProperTies.getDataSourceId(), defaultDataSource);
DataSourceContextHolder.dataSourceIds.add(ddsProperTies.getDataSourceId());
// 添加更多数据源
targetDataSources.putAll(customDataSources);
for (String key : customDataSources.keySet()) {
DataSourceContextHolder.dataSourceIds.add(key);
}
//将applicationContext转换为ConfigurableApplicationContext
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;

// 获取bean工厂并转换为DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();

    BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(DynamicDataSource.class);
    beanDefinitionBuilder.addPropertyValue("defaultTargetDataSource", defaultDataSource);
    beanDefinitionBuilder.addPropertyValue("targetDataSources", targetDataSources);
    beanFactory.registerBeanDefinition("dynamicDataSource", beanDefinitionBuilder.getRawBeanDefinition());
}

/**
 * 创建数据源
 * @author liuqiang
 */
@SuppressWarnings("unchecked")
private DataSource buildDataSource(Map<String, Object> dsMap) {
    try {
        Object type = dsMap.get("type");
        if (type == null)
            type = DATASOURCE_TYPE_DEFAULT;// 默认DataSource
        Class<? extends DataSource> dataSourceType;
        dataSourceType = (Class<? extends DataSource>) Class.forName((String) type);
        String driverClassName = dsMap.get("driverName").toString();
        String url = dsMap.get("url").toString();
        String username = dsMap.get("userName").toString();
        String password = dsMap.get("password").toString();
        DataSourceBuilder factory = DataSourceBuilder.create().driverClassName(driverClassName).url(url)
                .username(username).password(password).type(dataSourceType);
        return factory.build();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 为DataSource绑定更多数据
 *
 * @param dataSource
 */
private DataSource dataBinder(DataSource dataSource){
    RelaxedDataBinder dataBinder = new RelaxedDataBinder(dataSource);
    //dataBinder.setValidator(new LocalValidatorFactory().run(this.applicationContext));
    dataBinder.setConversionService(conversionService);
    dataBinder.setIgnoreNestedProperties(false);//false
    dataBinder.setIgnoreInvalidFields(false);//false
    dataBinder.setIgnoreUnknownFields(true);//true
    if(dataSourcePropertyValues == null){
        Map<String, Object> rpr = new RelaxedPropertyResolver(environment, "spring.datasource").getSubProperties(".");
        Map<String, Object> values = new HashMap<>(rpr);
        // 排除已经设置的属性
        values.remove("type");
        values.remove("driver-class-name");
        values.remove("url");
        values.remove("username");
        values.remove("password");
        dataSourcePropertyValues = new MutablePropertyValues(values);
    }
    dataBinder.bind(dataSourcePropertyValues);
    return dataSource;
}

/**
 * 初始化主数据源
 * @author liuqiang
 */
@PostConstruct
private void initDefaultDataSource() {
    // 读取主数据源

// RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
Map dsMap = new HashMap<>();
dsMap.put("alias", ddsProperTies.getDataSourceId());
dsMap.put("type", ddsProperTies.getType());
dsMap.put("driverName", ddsProperTies.getDriverName());
dsMap.put("url", ddsProperTies.getUrl());
dsMap.put("userName", ddsProperTies.getUserName());
dsMap.put("password", ddsProperTies.getPassword());
// DataSourceContextHolder.dsMaps.add(dsMap);
defaultDataSource = buildDataSource(dsMap);
defaultDataSource = dataBinder(defaultDataSource);
registerBeanDefinitions();
}

/**
 * 加载传入数据源
 * @author liuqiang
 */
public void initCustomDataSources(DynamicDataSourceModel dsRequest) {
    logger.info(String.format("加载数据源[%s]", JSONObject.toJSON(dsRequest)));
    Map<String, Object> dsMap = new HashMap<>();
    dsMap.put("alias", dsRequest.getAlias());
    dsMap.put("type", dsRequest.getType());
    dsMap.put("driverName", dsRequest.getDriverName());
    dsMap.put("url", dsRequest.getUrl());
    dsMap.put("userName", dsRequest.getUserName());
    dsMap.put("password", dsRequest.getPassword());

// DataSourceContextHolder.dsMaps.add(dsMap);
DataSource ds = buildDataSource(dsMap);
ds = dataBinder(ds);
customDataSources.put(dsRequest.getAlias(), ds);
registerBeanDefinitions();
}