生活随笔
收集整理的這篇文章主要介紹了
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改写自己查询规则思路的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。