sharding-jdbc系列之强制路由(十)

 

前言

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具体执行之前使用即可

猜你喜欢

转载自blog.csdn.net/u012394095/article/details/81665470