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连接池数据源。