Sharding-JDBC改写自己查询规则思路
Posted starjuly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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改写自己查询规则思路的主要内容,如果未能解决你的问题,请参考以下文章