概述
- 分片策略无需配置分片健
- 分片健值也不再从 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> {
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;
}
public void init() {
}
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> {
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;
}
public void init() {
}
public String getType() {
return "HINT_TEST_TAB";
}
}
使用
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 实现类当中进行加一操作即可,终止而言就是规则是可以自定义的,如果你在进入到企业之后你那家公司有自己的算法规则,就遵循即可。