在上一篇文章中,我们已经配置了数据源,并初步实现了分库的路由。接下来,我们将实现分表的路由。
在ShardingSphere
中,分表通常是通过分片键
和分片算法
来实现的。我们将以用户表为例,假设我们按照用户ID的最后一位数字进行分表。
- 在
config-sharding.yaml
中添加分表配置:
sharding:
tables:
user_${0..1}: # 分成2个表,分别是user_0和user_1
actualDataNodes: user_${0..1}.ds_${0..1}
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
tableStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: table_inline
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: user_${user_id % 2}
table_inline:
type: INLINE
props:
algorithm-expression: ${user_id % 2}
bindingTables:
- user_${0..1}
- 修改
ShardingDataSourceFactory
类,添加分表的配置:
// 加载配置
private static final Properties properties = new Properties();
static {
// 省略前面加载配置文件和注册数据源的代码...
// 分表策略
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
// 配置分库策略
shardingRuleConfig.getDatabaseShardingStrategyConfigs().put("database_inline", new InlineShardingStrategyConfiguration("user_id", "database_inline"));
// 配置分表策略
shardingRuleConfig.getTableShardingStrategyConfigs().put("table_inline", new InlineShardingStrategyConfiguration("user_id", "table_inline"));
// 配置绑定表
shardingRuleConfig.getBindingTableGroups().add("user_${0..1}");
// 省略其他分表配置...
// 省略后续的ShardingDataSource的创建代码...
}
在这个配置中,我们定义了user_${0..1}
作为绑定表组,这意味着user_0
和user_1
将作为一个整体进行数据分片。然后,我们定义了database_inline
和table_inline
两种分片算法,分别用于分库和分表。
- 实现分片算法:
public class InlineShardingAlgorithm implements ShardingAlgorithm {
private Properties props = new Properties();
private String algorithmExpression;
@Override
public String getType() {
return "INLINE";
}
@Override
public Properties getProps() {
return props;
}
@Override
public void setProps(Properties props) {
this.props = props;
this.algorithmExpression = props.getProperty("algorithm-expression");
}
@Override
public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
for (String each : availableTargetNames) {
if (each.endsWith(eval(each, shardingValue))) {