强制路由剖析

基本介绍

ShardingSphere提供的Hint机制用于处理分片条件不存在于SQL本身、而存在于外部业务逻辑的场景。HintManager是关键组件,基于ThreadLocal实现线程隔离。

典型使用场景

  • 跨库事务需要强制多个操作路由到同一节点
  • 特殊查询需要指定到特定分片执行
  • 系统维护时需要将操作定向到指定节点
  • 分片键不在SQL中的复杂查询场景
try (HintManager hintManager = HintManager.getInstance()) {
    hintManager.addDatabaseShardingValue("order", 1);
    hintManager.addTableShardingValue("order", 1);
    orderRepository.queryOrders();
}

使用场景

数据分片操作

当分片键未直接体现在SQL或表结构中,而是通过业务逻辑动态计算时使用:

  • 复合分片键(多字段组合)
  • 派生分片键(业务规则转换)
  • 外部系统依赖

读写分离操作

强制走主库的场景:

  • 金融交易流水记录、库存扣减、秒杀下单
  • 事务中的查询操作(避免脏读)
  • 先写后读的业务流程

使用过程

1. 实现HintShardingAlgorithm接口

public class MyHintShardingAlgorithm implements HintShardingAlgorithm<Integer> {
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames,
                                         HintShardingValue<Integer> shardingValue) {
        return availableTargetNames;
    }
}

2. 配置文件中指定策略

spring.shardingsphere.sharding.tables.b_order.database-strategy.hint.algorithm-class-name=com.lagou.hint.MyHintShardingAlgorithm
spring.shardingsphere.sharding.tables.b_order.actual-data-nodes=ds$->{0..1}.b_order$->{0..1}

3. 代码中使用HintManager

try (HintManager hintManager = HintManager.getInstance()) {
    hintManager.addDatabaseShardingValue("b_order", 1);
    hintManager.addTableShardingValue("b_order", 1);
    List<Order> list = orderRepository.findAll();
}

4. 读写分离强制主库

try (HintManager hintManager = HintManager.getInstance()) {
    hintManager.setMasterRouteOnly();
    // 执行需要实时性的SQL查询
}