Hint分片算法

概述

  • 分片策略无需配置分片健
  • 分片健值也不再从 SQL 中解析,而是由外部指定分片信息,让 SQL 在指定的分库、分表中执行
  • 通过 Hint API 在外部手动指定分片健或分片库

使用步骤

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

image-20211218163654108

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

image-20211218163807261

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

image-20211218170115183

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

posted @ 2021-12-18 18:48  BNTang  阅读(1356)  评论(0编辑  收藏  举报