ShardingJdbc 5.x 实现 自定义分片策略
变更原因
在ShardingJdbc 5.x版本中,已经去除了 分片策略的yml配置方式,改用SPI方式进行分片策略的注入了,所以之前4.x版本时的分片方法已经不实用了,经过源码阅读,采用以下方式可以自定义分片策略。
操作
- 编写分片策略类实现org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm<?>接口
public class MonthShardingAlgorithm implements StandardShardingAlgorithm<Date> {
private static final Logger logger = LoggerFactory.getLogger(MonthShardingAlgorithm.class);
private Properties props = new Properties();
@Override
public String doSharding(Collection<String> collection, PreciseShardingValue<Date> preciseShardingValue) {
// 实现精确分片
}
@Override
public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Date> rangeShardingValue) {
// 实现范围分片
}
@Override
public void init() {
logger.info("初始化按月分片算法");
}
@Override
public String getType() {
// MONTH_SHARD 作为该分片策略的 key
return ShardingConstants.MONTH_SHARD;
}
@Override
public Properties getProps() {
return props;
}
@Override
public void setProps(Properties props) {
this.props = props;
}
}
-
在 resource 文件夹下创建 META-INF/services文件夹,并在该文件夹下创建org.apache.shardingsphere.sharding.spi.ShardingAlgorithm文件
在文件中指明分片策略类MonthShardingAlgorithm
的全类名 -
在ShardingJdbcConfig中,配置分表算法时指定该分片策略名称
// 配置分表算法 设置按月分表
shardingRuleConfig.getShardingAlgorithms().put(ShardingConstants.TABLE_SHARDING_ALGORITHM_KEY,
// MONTH_SHARD 即上述分片算法的Key
new ShardingSphereAlgorithmConfiguration(ShardingConstants.MONTH_SHARD, new Properties()));
DEMO地址
https://gitee.com/airtrioa/sharding-jdbc-demo
说明
- 建议没有一定 开发经验的人还是不要去一知半解的使用开源组件吧,非常多的坑要踩。尤其是面对不正常的需求时(我想破头也没有想到,之前项目组为啥要用
Oracle
分库分表,并且还特么同时拿了MySQL
做备库) - 当然
MySQL
和Oracle
直接做分库,Sharding-Jdbc
也是不支持的,至少5.0.0
不支持