针对ShardingSphere-JDBC 5.0.0的数据源Bean Class名字问题的解决方案

在构建多数据源的时候,以dynamic-datasource-spring-boot-starter组件为例,其需要将ShardingSphere-JDBC的内部数据源放入dynamic-datasource-spring-boot-starter的数据源内托管. 而在4.1.1版本,ShardingSphere-JDBC有四种功能不同的数据源名字, 各为

* shardingjdbc有四种数据源,需要根据业务注入不同的数据源
     *
     * <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
     * <p>2. 主从数据源: masterSlaveDataSource;
     * <p>3. 脱敏数据源:encryptDataSource;
     * <p>4. 影子数据源:shadowDataSource;
*

此四个数据源名字我从 踩坑sharding jdbc,集成多数据源 - 知乎 (zhihu.com) 得知.
而在SharingSphere-JDBC 5.0.0版本,数据源的名字已经更改.我并没有在shardingsphere doc看到其介绍,是否有朋友能给出其数据源Bean的名字清单?shardingsphere doc仅给出注入数据源的方法,没有提及数据源的具体Bean Java Class.

我目前只得知其中一个改名的数据源名字,其他尚不清楚.



下为数据源配置类的示例文件

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class MyDataSourceConfiguration {
    private static final String SHARDING_DATA_SOURCE_NAME = "gits_sharding";
    @Resource
    private DynamicDataSourceProperties properties;
    @Resource(name = "shardingSphereDataSource")
    private DataSource shardingDataSource;
    @Resource(name = "shardingDataSource")
    private DataSource oldShardingDataSource;
    @Resource(name = "masterSlaveDataSource")
    private DataSource masterSlaveDataSource;
    @Resource(name = "encryptDataSource")
    private DataSource encryptDataSource;
    @Resource(name = "shadowDataSource")
    private DataSource shadowDataSource;
    
    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = new HashMap<>();
                dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
                return dataSourceMap;
            }
        };
    }

    @Primary
    @Bean
    public DataSource dataSource() {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }
}

下为ShardingSphere-JDBC4.1.1dynamic-datasource-spring-boot-starter整合的代码示例,方便解释为什么通过dynamic-datasource-spring-boot-starter构建的多数据源需要有数据源Bean的名字:
dynamic-datasource-samples/third-part-samples/sharding-jdbc-sample at master · dynamic-datasource/dynamic-datasource-samples (github.com)

3 个赞

确认shardingsphere 5.0.0仅保留org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory,类似MasterSlaveDataSourceFactory这样的的工厂类已取消,只是shardingsphere5.0.0的文档未更新.此问题可关闭.


2 个赞

title改为“针对ShardingSphere-JDBC 5.0.0的数据源Bean Class名字问题的解决方案”就更棒了

1 个赞

谢谢提醒,已修整标题

京ICP备2021015875号