1、pom文件
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
2、建表
3、配置
application.properties
sharding.jdbc.datasource.names=ds_master0,ds_master1
# 数据源1
sharding.jdbc.datasource.ds_master0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master0.url=jdbc\:mysql\://ip\:3306/user_0?useUnicode\=true&characterEncoding\=UTF-8&autoReconnect\=true&failOverReadOnly\=false&allowMultiQueries\=true
sharding.jdbc.datasource.ds_master0.username=root
sharding.jdbc.datasource.ds_master0.password=root
# 数据源2
sharding.jdbc.datasource.ds_master1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master1.url=jdbc\:mysql\://ip\:3306/user_1?useUnicode\=true&characterEncoding\=UTF-8&autoReconnect\=true&failOverReadOnly\=false&allowMultiQueries\=true
sharding.jdbc.datasource.ds_master1.username=root
sharding.jdbc.datasource.ds_master1.password=root
# 控制台打印sql语句
sharding.jdbc.config.sharding.props.sql.show=true
# 配置表节点
sharding.jdbc.config.sharding.tables.user_info.actual-data-nodes=ds_master$->{0..1}.user_info_$->{0..1}
#分表匹配字段
sharding.jdbc.config.sharding.tables.user_info.table-strategy.standard.sharding-column=user_id
# 分表策略实现
sharding.jdbc.config.sharding.tables.user_info.table-strategy.standard.precise-algorithm-class-name=com.smh.config.DemoTableShardingAlgorithm
#分库匹配字段
sharding.jdbc.config.sharding.default-database-strategy.standard.sharding-column=user_id
#分库策略实现
sharding.jdbc.config.sharding.default-database-strategy.standard.precise-algorithm-class-name=com.smh.config.DemoTableShardingAlgorithm
使用application.properties配置的方式比较简单,不用写配置类。
4、分库分表的策略
1、PreciseShardingAlgorithm
精准分片策略,Precise处理 = 和 in的路由
public interface PreciseShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
/**
* Sharding.
* @param availableTargetNames available data sources or tables's names
* @param shardingValue sharding value
* @return sharding result for data source or table's name
*/
String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<T> shardingValue);
}
看jdk注释已经很清楚了,availableTargetNames参数是数据源(数据库)或者是表的名字的集合,shardingValue参数是分片或者分表所指定的字段。返回值是数据源或者表的名字。
具体实现:
public class DemoTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
for (String each : collection) {
if (each.endsWith(Long.parseLong(preciseShardingValue.getValue().toString()) % 2+"")) {
return each;
}
}
throw new IllegalArgumentException();
}
}
按照配置文件中的配置,以user_id作为分片的字段。对user_id对2取模,结果匹配数据源名结尾字符。
2、RangeShardingAlgorithm
范围分片策略,处理 BETWEEN 的路由
public interface RangeShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
/**
* Sharding.
* @param availableTargetNames available data sources or tables's names
* @param shardingValue sharding value
* @return sharding results for data sources or tables's names
*/
Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<T> shardingValue);
}
availableTargetNames参数是数据源(数据库)或者是表的名字的集合,shardingValue参数是分片或者分表所指定的字段。返回值是数据源或者表的名字的集合。
5、总结
这种配置方法是我比较喜欢的,也非常简单。总体来说逻辑是:
1、先建库建表;
2、实现分库和分表的接口;
3、在application.properties文件里配置数据源、配置表节点、配置分表字段、配置分库分表策略的实现类。
深入学习,请静待更新。。