sharding proxy自定义分片规则 standard算法
其他的都类似,只不过参数不太一样,重写之后想怎么玩就怎么玩
首先创建简单maven项目,这里不做说明,自己搞
物理库自行创建,必须有分片列,其他随意。
导入依赖
<!-- sharding-jdbc依赖 --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>4.0.0-RC1</version> </dependency>
1.preciseAlgorithmClassName 精确(针对 sql中的 = 或者 in 方式)分片属性自定义分片规则
创建自定义的方法,需要实现 ShardingAlgorithm接口或者这个接口的子类,并重写里面的方法(就一个),下面是我的类中的全部代码,根据需要自己改
package com.standard; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue; import java.util.Collection; import java.util.HashMap; import java.util.Map; import static java.lang.System.out; /** * @author :zhangyantao * @date : 2020/6/9 18:20 * standard 分片算法自定义实现 * 精确分片算法 **/ public class LocalPreciseShardingAlgorithm implements PreciseShardingAlgorithm<String> { /** * 数据库前缀 */ private static final String PREFIX = "ds_"; /** * 自定义库名配置 */ private static Map<String, String> map = new HashMap<String, String>(); static { map.put("420216", "370201"); } /** * availableTargetNames 被查到的库列表 * preciseShardingValue 分片列的值 */ @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> preciseShardingValue) { out.println("============================single sharding============================="); if (preciseShardingValue != null) { String value = preciseShardingValue.getValue(); for (String name : availableTargetNames) { if (null != map.get(value) && map.get(value).trim().length() > 0) { //特定分片值处理 value = map.get(value); } String newName = PREFIX + Integer.parseInt(value) / 10000; if (newName.equals(name)) { return name; } } throw new UnsupportedOperationException("没有匹配到可用库"); } else { throw new UnsupportedOperationException("分片列为空"); } } }
写完之后把整个项目打成jar包,然后把jar包导入到sharding proxy解压目录下的 lib ,然后在分库或分表的分片算法位置使用
databaseStrategy:
standard:
shardingColumn: STR_AREA_CODE
preciseAlgorithmClassName: com.standard.CustomShardingTest
在preciseAlgorithmClassName处调用jar包内的类路径,jar包放在lib下面,启动时自动加载。
2.rangeAlgorithmClassName 范围分片自定义
实现ShardingAlgorithm接口或者其子类,这里做简单规则
package com.standard; import com.google.common.collect.Range; import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static java.lang.System.out; /** * @author :zhangyantao * @apiNote :standard 范围分片算法 * @date : 2020/6/10 14:43 **/ public class LocalRangeShardingAlgorithm implements RangeShardingAlgorithm<String> { /** * 数据库前缀 */ private static final String PREFIX = "ds_"; private static List<String> localList = new ArrayList<String>(); static { localList.add("379999"); localList.add("459999"); } @Override public Collection<String> doSharding(Collection<String> targetNames, RangeShardingValue<String> rangeShardingValue) { out.println("============================range sharding============================="); if (rangeShardingValue != null) { List<String> list = new ArrayList<String>(); Range<String> valueRange = rangeShardingValue.getValueRange(); for (String name : targetNames) { for (String l : localList) { if (valueRange.contains(l)) { String newName = PREFIX + Integer.parseInt(l) / 10000; if (name.equals(newName)) { list.add(name); } } } } if (list.size() > 0) { return list; } throw new UnsupportedOperationException("没有匹配到可用库"); } else { throw new UnsupportedOperationException("分片列为空"); } } }
可以和其他的自定义规则放到一起,互不影响
使用:
databaseStrategy:
standard:
shardingColumn: STR_AREA_CODE
rangeAlgorithmClassName: com.standard.LocalRangeShardingAlgorithm
3.两者一起使用也可以
databaseStrategy:
standard:
shardingColumn: STR_AREA_CODE
preciseAlgorithmClassName: com.standard.LocalPreciseShardingAlgorithm
rangeAlgorithmClassName: com.standard.LocalRangeShardingAlgorithm
这个人很懒,什么也没下留。
分类:
ShardingSphere
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)