Hint分片算法
  TEZNKK3IfmPf 2023年11月13日 34 0
  • 分片策略无需配置分片健
  • 分片健值也不再从 SQL 中解析,而是由外部指定分片信息,让 SQL 在指定的分库、分表中执行
  • 通过​​Hint​​ API 在外部手动指定分片健或分片库

使用步骤

修改 application.properties,移除分片健,与分片库信息:

Hint分片算法

然后就是配置 hint 分片 sharding-algorithm-name,type:

Hint分片算法

# 配置分库策略  主键+分片算法
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, 所有走的就是两个库:

Hint分片算法

如果想要走到某一个库当中就要在 db 的 SPI 实现类当中进行加一操作即可,终止而言就是规则是可以自定义的,如果你在进入到企业之后你那家公司有自己的算法规则,就遵循即可。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   46   0   0 dremiosqltable
  TEZNKK3IfmPf   2024年04月26日   49   0   0 java数据库sql
  TEZNKK3IfmPf   2024年05月17日   48   0   0 sqlmysql
  TEZNKK3IfmPf   2024年05月17日   36   0   0 sqlcube
  TEZNKK3IfmPf   2024年04月26日   23   0   0 javasql
  TEZNKK3IfmPf   2024年04月19日   50   0   0 sqlUser
TEZNKK3IfmPf