sharding-jdbc使用实战

使用背景

项目中使用中表数据过大,需要分表操作。并且在项目业务中许多场景下单表数据过大时,也需要分表操作,这次尝试在某一组件内引入shsharding-jdbc,并逐步形成项目通用组件。

组件简介

在spring环境中引入sharding-jdbc,相当于dataSource组件替换成shsharding-jdbc的dataSource,完成原有的数据源替换,查询以及插入时会使用sharding-jdbc的数据源做相应的分片操作,并生成sql,完成增删改操作。

如果引用数据源换成了新的,那么就是替换掉原有的数据源,原有数据源的一些sql可能会产生影响,那么项目中需要尝试多数据源切换,以满足不需要分库分表的数据使用原有数据源。

项目引入

pom配置

<!--<dependency>-->
<!--<groupId>com.alibaba</groupId>-->
<!--<artifactId>druid-spring-boot-starter</artifactId>-->
<!--<version>${druid-spring-boot-starter}</version>-->
<!--</dependency>-->
<!--去除连接池自启动,将使用新的数据源组件,但是连接池不变-->

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid-version}</version>
</dependency>

<!--sharding-jdbc的启动包引入-->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>

<!--多数据源插件引入-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>${dynamic-datasource-spring-boot-starter}</version>
</dependency>


启动配置

@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,
        SpringBootConfiguration.class})
public class DataSourceConfiguration {


    /**
     * 动态数据源配置项
     */
    @Autowired
    private DynamicDataSourceProperties properties;

    @Lazy
    @Resource
    AbstractDataSourceAdapter shardingDataSource;

    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
                // 将 shardingjdbc 管理的数据源也交给动态数据源管理
                dataSourceMap.put(ShardingJdbcConstant.DATA_SOURCE_NAME, shardingDataSource);
                return dataSourceMap;
            }
        };
    }

    /**
     * 将动态数据源设置为首选的
     * 当spring存在多个数据源时, 自动注入的是首选的对象
     * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
     */
    @Primary
    @Bean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }

}

配置文件

spring.datasource.dynamic.datasource.master.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.dynamic.datasource.master.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url = 
spring.datasource.dynamic.datasource.master.username = 
spring.datasource.dynamic.datasource.master.password = 
spring.datasource.dynamic.primary = master

# 配置真实数据源
spring.shardingsphere.datasource.names = ds0

# 配置数据源
spring.shardingsphere.datasource.ds0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name = com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url = 
spring.shardingsphere.datasource.ds0.username = 
spring.shardingsphere.datasource.ds0.password = 

# 配置 hpcmsg_platforom_msg 表规则,也可使用自定策略,指定自定义策略类
# 详见官方文档 shardingsphere
spring.shardingsphere.rules.sharding.tables.table_name.actual-data-nodes = 

项目启动后使用@DS注解完成切换数据源操作,默认数据源还是原有的druid连接池数据源。