Hint分片算法
概述
- 分片策略无需配置分片健
- 分片健值也不再从 SQL 中解析,而是由外部指定分片信息,让 SQL 在指定的分库、分表中执行
- 通过
Hint
API 在外部手动指定分片健或分片库
使用步骤
修改 application.properties,移除分片健,与分片库信息:
然后就是配置 hint 分片 sharding-algorithm-name,type:
# 配置分库策略 主键+分片算法
spring.shardingsphere.rules.sharding.tables.t_order.database-strategy.hint.sharding-algorithm-name=hint-db
spring.shardingsphere.rules.sharding.sharding-algorithms.hint-db.type=HINT_TEST_DB
# 配置分表策略 主键+分片算法
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.hint.sharding-algorithm-name=hint-table
spring.shardingsphere.rules.sharding.sharding-algorithms.hint-table.type=HINT_TEST_TAB
然后创建 SPI 相关扩展实现类。
HintDbShardingAlgorithm.java
/**
* @author BNTang
* @version V1.0
* @project sharding-sphere
* @date Created in 2021/12/18 /018 16:54
* @description
**/
public class HintDbShardingAlgorithm implements HintShardingAlgorithm<Long> {
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames,
HintShardingValue<Long> shardingValue) {
String key = "shardingspheredb" + shardingValue.getValues().toArray()[0];
if (availableTargetNames.contains(key)) {
return Collections.singletonList(key);
}
return availableTargetNames;
}
@Override
public void init() {
}
@Override
public String getType() {
return "HINT_TEST_DB";
}
}
HintTableShardingAlgorithm.java
/**
* @author BNTang
* @version V1.0
* @project sharding-sphere
* @date Created in 2021/12/18 /018 16:57
* @description
**/
public class HintTableShardingAlgorithm implements HintShardingAlgorithm<Long> {
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames,
HintShardingValue<Long> shardingValue) {
String key = shardingValue.getLogicTableName() + "_" + shardingValue.getValues().toArray()[0];
if (availableTargetNames.contains(key)) {
return Collections.singletonList(key);
}
return availableTargetNames;
}
@Override
public void init() {
}
@Override
public String getType() {
return "HINT_TEST_TAB";
}
}
使用
@Test
void getOrderByHint() {
HintManager hintManager = HintManager.getInstance();
hintManager.addTableShardingValue("t_order", 0L);
hintManager.addDatabaseShardingValue("t_order", 0L);
this.orderMapper.selectList(null).forEach(System.out::println);
hintManager.close();
}
如上代码的含义为,只查询 t_order_0 表,因为博主的库当中没有 shardingspheredb0, 所有走的就是两个库:
如果想要走到某一个库当中就要在 db 的 SPI 实现类当中进行加一操作即可,终止而言就是规则是可以自定义的,如果你在进入到企业之后你那家公司有自己的算法规则,就遵循即可。
标签:
ShardingSphere
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具