生活随笔
收集整理的这篇文章主要介绍了
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改写自己查询规则思路的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。