前言
sharding-jdbc允许我们在程序运行过程中,强制设置某一次SQL的路由规则、
强制路由数据库
代码解读
private Collection<String> routeDataSources(final TableRule tableRule) {
// 获取分库策略
DatabaseShardingStrategy strategy = shardingRule.getDatabaseShardingStrategy(tableRule);
// 判断是否需要强制路由,根据分片键,从SqlStatement中获取分片值
List<ShardingValue<?>> shardingValues = HintManagerHolder.isUseShardingHint() ? getDatabaseShardingValuesFromHint(strategy.getShardingColumns())
: getShardingValues(strategy.getShardingColumns());
// 静态分片算法。 内部调用了,我们自定义的分库策略的方法。
Collection<String> result = strategy.doStaticSharding(tableRule.getActualDatasourceNames(), shardingValues);
Preconditions.checkState(!result.isEmpty(), "no database route info");
return result;
}
HintManagerHolder.isUseShardingHint() 就是判断当前路由数据库是否需要强制路由,
具体使用
@RequestMapping("select")
@ResponseBody
public List<User> select(){
HintManager hintManager = HintManager.getInstance();
// 设置强制分库规则,该逻辑表进行路由时,分片键id强行设置为11
hintManager.addDatabaseShardingValue("t_user","id",11);
List<User> user = userService.selectUser();
hintManager.close()
return user;
}
在SQL具体执行之前使用即可
强制路由表
private Collection<String> routeTables(final TableRule tableRule, final String routedDataSource) {
// 获取分表策略
TableShardingStrategy strategy = shardingRule.getTableShardingStrategy(tableRule);
// 判断是否需要强制路由,通过分片键,从SqlStatement中获取分片值
List<ShardingValue<?>> shardingValues = HintManagerHolder.isUseShardingHint() ? getTableShardingValuesFromHint(strategy.getShardingColumns())
: getShardingValues(strategy.getShardingColumns());
// tableRule.isDynamic() 判断是动态分片,还是静态分片,调用不同的分片算法,后面会单独开文章讲
Collection<String> result = tableRule.isDynamic() ? strategy.doDynamicSharding(shardingValues) : strategy.doStaticSharding(tableRule.getActualTableNames(routedDataSource), shardingValues);
Preconditions.checkState(!result.isEmpty(), "no table route info");
return result;
}
HintManagerHolder.isUseShardingHint() 就是判断当前路由数据库是否需要强制路由,
具体使用
@RequestMapping("select")
@ResponseBody
public List<User> select(){
HintManager hintManager = HintManager.getInstance();
hintManager.addTableShardingValue("t_user","user_id",Long.valueOf(11));
List<User> user = userService.selectUser();
hintManager.close()
return user;
}
在SQL具体执行之前使用即可