Sharding-JDBC改写自己查询规则思路

问题

  • Sharding-JDBC一般是根据主键策略进行分片分表,在查询主键时根据路由规则能很快找到要查询的表,但是如果要查询的是其他字段呢,那么Sharding-JDBC就会将所有符合的表逐个查询,这样执行就会慢些。
  • 假如自己的某些字段是和主键一样,也是有规则的,那么也能不能直接找到合适的表,而不需要所有表做匹配呢?

核心代码

  • 有了这个问题,那么就调试,发现了的组装要执行sql的代码,方法路径如下:
org.apache.shardingsphere.core.BaseShardingEngine#rewriteAndConvert
  • 该方法代码如下:
    private Collection<RouteUnit> rewriteAndConvert(final String sql, final List<Object> parameters, final SQLRouteResult sqlRouteResult) {
        SQLRewriteContext sqlRewriteContext = new SQLRewriteContext(metaData.getRelationMetas(), sqlRouteResult.getSqlStatementContext(), sql, parameters);
        new ShardingSQLRewriteContextDecorator(shardingRule, sqlRouteResult).decorate(sqlRewriteContext);
        boolean isQueryWithCipherColumn = shardingProperties.<Boolean>getValue(ShardingPropertiesConstant.QUERY_WITH_CIPHER_COLUMN);
        new EncryptSQLRewriteContextDecorator(shardingRule.getEncryptRule(), isQueryWithCipherColumn).decorate(sqlRewriteContext);
        sqlRewriteContext.generateSQLTokens();
        Collection<RouteUnit> result = new LinkedHashSet<>();
        for (RoutingUnit each : sqlRouteResult.getRoutingResult().getRoutingUnits()) {
            ShardingSQLRewriteEngine sqlRewriteEngine = new ShardingSQLRewriteEngine(shardingRule, sqlRouteResult.getShardingConditions(), each);
            SQLRewriteResult sqlRewriteResult = sqlRewriteEngine.rewrite(sqlRewriteContext);
            result.add(new RouteUnit(each.getDataSourceName(), new SQLUnit(sqlRewriteResult.getSql(), sqlRewriteResult.getParameters())));
        }
        return result;
    }
  • 上边方法的参数中,sql是要我们执行的sql,parameters是这条sql要执行的参数。代码中会先根据要执行的sql生成所有匹配到表的sql,还有就是在for循环中就会添加所有合适规则的sql返回。
  • 也就是说可以根据传入的sql和参数,在for循环中找到合适自己要执行的sql,合适则执行result.add()方法,反之则不执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值