在ShardingJdbc 5.x版本中,使用SPI方式进行分片策略的注入。
1. 编写分库策略
package com.demo.server.config;
import java.util.Collection;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class DatabaseShardingAlgorithm implements StandardShardingAlgorithm<String> {
private Properties props;
@Value("${sharding.dbshardcount}")
private Long dbshardCount = 1l;
public Properties getProps() {
return props;
}
public void setProps(Properties props) {
this.props = props;
}
@Override
public String doSharding(Collection<String> databaseNames, PreciseShardingValue<String> shardingValue) {
Long lShard = 0l;
String value = shardingValue.getValue();
String number = getNumber(value);
// 字符串转换为数字
lShard = Long.parseLong(number);
// 取最低位
// 这里假设分为10个库,0-9
Long shardMod = lShard % 10;
for (String database : databaseNames) {
if (database.endsWith(String.valueOf(shardMod))) {
return database;
}
}
return "";
}
@Override
public String getType() {
return "SHLD_DBSHARD";
}
@Override
public void init() {
// 这里可以进行必要的初始化
}
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames,
RangeShardingValue<String> shardingValue) {
// 这里可以定义范围分片策略
return null;
}
String getNumber(String str) {
// 只允数字
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
// 替换与模式匹配的所有字符(即非数字的字符将被"0"替换)
return m.replaceAll("0").trim();
}
}
2. 在 resource 文件夹下创建 META-INF/services文件夹,并在该文件夹下创建文件名为org.apache.shardingsphere.sharding.spi.ShardingAlgorithm的文件,并在文件中写入分片策略类全路径名。
com.demo.server.config.DatabaseShardingAlgorithm
3. 在ShardingJdbcConfig中,配置分表算法时指定该分片策略名称以及分库策略的属性,该属性可以在分库策略中使用。
Properties pTable = new Properties();
pTable.setProperty("dbshardCount", String.valueOf(dbshardCount));
// 设置分库策略
ShardingSphereAlgorithmConfiguration ssacdb = new ShardingSphereAlgorithmConfiguration(
"SHLD_DBSHARD", pTable);
shardingRuleConfiguration.getShardingAlgorithms().put("dbShardingAlgorithm", ssacdb);
设置了分库属性以及分库算法的类型,作为分库算法的配置。