强制路由剖析
基本介绍
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查询
}