您现在的位置:首页 > >

Spring Boot中整合Sharding-JDBC单库分表示例

发布时间:

今天给大家演示的是单库中分表的操作,如果用XML方式配置,那么就是下面的配置:























我们将user表分成了4个,分别是user_0,user_1,user_2,user_3,通过id取模的方式决定数据落在哪张表上面。


如果用Spring Boot方式配置自然就简单多了,如下:


sharding.jdbc.datasource.names=ds_master


数据源

sharding.jdbc.datasource.ds_master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
sharding.jdbc.datasource.ds_master.username=root
sharding.jdbc.datasource.ds_master.password=123456


分表配置

sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds_master.user_{0..3}??
● actual-data-nodes:真实数据节点,由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式。
● table-strategy.inline.sharding-column:分片字段配置
● table-strategy.inline.algorithm-expression:分片算法表达式


阿里云代金券1000元免费领取!领取地址:http://aliyun.jinre.com
新*⒗镌普嘶Ь闪烊。】捎糜诠郝虬⒗镌品衿鱁CS、云数据库RDS、虚拟主机、安骑士、DDoS高防IP等100多云计算产品。
代金券自领取之日起,有效期是30天,请及时使用,过30天后还可以重新领取。


自定义分片算法


在1.x版本中,单分片算法是通过实现SingleKeyTableShardingAlgorithm,示例代码如下:


import java.util.Collection;
import java.util.LinkedHashSet;


import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;
import com.google.common.collect.Range;


public class UserSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm {


public String doEqualSharding(Collection availableTargetNames, ShardingValue shardingValue) {
for (String each : availableTargetNames) {
System.out.println(each+” ”+shardingValue.getValue()+” ”+shardingValue.getValue() % 4 );
if (each.endsWith(shardingValue.getValue() % 4 + “”)) {
return each;
}
}
throw new IllegalArgumentException();
}


public Collection doInSharding(Collection availableTargetNames, ShardingValue shardingValue) {
Collection result = new LinkedHashSet<>(availableTargetNames.size());
for (Long value : shardingValue.getValues()) {
for (String tableName : availableTargetNames) {
if (tableName.endsWith(value % 4 + “”)) {
result.add(tableName);
}
}
}
return result;
}


public Collection doBetweenSharding(Collection availableTargetNames,
ShardingValue shardingValue) {
Collection result = new LinkedHashSet<>(availableTargetNames.size());
Range range = (Range) shardingValue.getValueRange();
for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {
for (String each : availableTargetNames) {
if (each.endsWith(i % 4 + “”)) {
result.add(each);
}
}
}
return result;
}


}
我们这边引入的Spring Boot Starter包是2.x的版本,在这个版本中,分片算法的接口有调整,我们需要用到标准分片策略StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。


StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。


PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。


自定义一个单分片算法:


import java.util.Collection;
import io.shardingjdbc.core.api.algorithm.sharding.PreciseShardingValue;
import io.shardingjdbc.core.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
/**
* 自定义分片算法
*
* @author yinjihuan
*
*/
public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm {


@Override
public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
for (String tableName : availableTargetNames) {
if (tableName.endsWith(shardingValue.getValue() % 4 + “”)) {
return tableName;
}
}
throw new IllegalArgumentException();
}


}
使用需要修改我们之前的配置:


sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds_master.user_${0..3}
sharding.jdbc.config.sharding.tables.user.table-strategy.standard.sharding-column=id
sharding.jdbc.config.sharding.tables.user.table-strategy.standard.precise-algorithm-class-name=com.fangjia.sharding.MyPreciseShardingAlgorithm


热文推荐
猜你喜欢
友情链接: 医学资料大全 农林牧渔 幼儿教育心得 小学教育 中学 高中 职业教育 成人教育 大学资料 求职职场 职场文档 总结汇报