You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2019/09/26 11:47:07 UTC

[GitHub] [incubator-shardingsphere] zdmwww commented on issue #3119: HintManager Of Version 4.0.0.RC2 Can‘t Work Under Multi DataSource Scenes

zdmwww commented on issue #3119: HintManager Of Version 4.0.0.RC2 Can‘t Work Under Multi DataSource Scenes
URL: https://github.com/apache/incubator-shardingsphere/issues/3119#issuecomment-535466780
 
 
   from the source code,
   In version 3.1.0, ShardingPreparedStatement.getResultSet() has the code:
   
   
   ```
    if (this.routeResult.getSqlStatement() instanceof **SelectStatement** || this.routeResult.getSqlStatement() instanceof DALStatement) {
                   MergeEngine mergeEngine = MergeEngineFactory.newInstance(this.connection.getShardingContext().getDatabaseType(), this.connection.getShardingContext().getShardingRule(), this.routeResult.getSqlStatement(), this.connection.getShardingContext().getMetaData().getTable(), queryResults);
   
                   this.currentResultSet = new ShardingResultSet(resultSets, mergeEngine.merge(), this);
               }
   ```
   
   But in version 4.0.0-RC2, the code  is like this:
    
   ```
    if (this.sqlRouteResult.getOptimizedStatement() instanceof **ShardingSelectOptimizedStatement** || this.sqlRouteResult.getOptimizedStatement().getSQLStatement() instanceof DALStatement) {
                   MergeEngine mergeEngine = MergeEngineFactory.newInstance(this.connection.getRuntimeContext().getDatabaseType(), (ShardingRule)this.connection.getRuntimeContext().getRule(), this.sqlRouteResult, this.connection.getRuntimeContext().getMetaData().getTable(), queryResults);
                   this.currentResultSet = this.getCurrentResultSet(resultSets, mergeEngine);
               }
   ```
   
   ShardingSelectOptimizedStatement  in 4.0.0-RC2 is different from SelectStatement In version 3.1.0, May  be this is problem.
   
   In version 4.0.0-RC2, The ShardingRouterFactory   is Like this:
   
   ```
   public final class ShardingRouterFactory {
       public static ShardingRouter newInstance(ShardingRule shardingRule, ShardingMetaData shardingMetaData, DatabaseType databaseType, boolean showSQL) {
           return (ShardingRouter)(HintManagerHolder.isDatabaseShardingOnly() ? new DatabaseHintSQLRouter(shardingRule, showSQL) : new ParsingSQLRouter(shardingRule, shardingMetaData, databaseType, showSQL));
       }
   
       private ShardingRouterFactory() {
       }
   }
   ```
   
   When use the HintManager set shardingvalue, the isDatabaseShardingOnly has been set to true,
   So will create DatabaseHintSQLRouter and  the sqlStatement is TransparentOptimizedStatement ,So the result can't be merged ,So HintManger can't support multi datasource In version 4.0.0-RC2。
   
   DatabaseHintSQLRouter.Java:
   
   ```
       public SQLRouteResult route(String logicSQL, List<Object> parameters, SQLStatement sqlStatement) {
           SQLRouteResult result = new SQLRouteResult(new **TransparentOptimizedStatement**(sqlStatement));
           RoutingResult routingResult = (new DatabaseHintRoutingEngine(this.shardingRule.getShardingDataSourceNames().getDataSourceNames(), (HintShardingStrategy)this.shardingRule.getDefaultDatabaseShardingStrategy())).route();
           result.setRoutingResult(routingResult);
           return result;
       }
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services