日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2025/3/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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改写自己查询规则思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。