欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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()方法,反之则不执行。

总结

以上是生活随笔为你收集整理的Sharding-JDBC改写自己查询规则思路的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。