mycat单表插入(二)

3.获取路由的结果

  • 【 1 - 2 】【 11】获取路由的主流程

    【RouteService.java】
      public RouteResultset route(SystemConfig sysconf, SchemaConfig schema,
              int sqlType, String stmt, String charset, ServerConnection sc)
              throws SQLNonTransientException {
          RouteResultset rrs = null;
          String cacheKey = null;
    
          //......省略代码
        
          int hintLength = RouteService.isHintSql(stmt);
          if(hintLength != -1){
          //......省略代码
          } else {
              stmt = stmt.trim();
              //策略模式 策略工厂??
              rrs = RouteStrategyFactory.getRouteStrategy().route(sysconf, schema, sqlType, stmt,
                      charset, sc, tableId2DataNodeCache);
          }
    
          if (rrs != null && sqlType == ServerParse.SELECT && rrs.isCacheAble()) {
              sqlRouteCache.putIfAbsent(cacheKey, rrs);
          }
          //TODO 检查迁移路由?
          checkMigrateRule(schema.getName(),rrs,sqlType);
          return rrs;
      }    
    
    
    【AbstractRouteStrategy.java】
      @Override
      public RouteResultset route(SystemConfig sysConfig, SchemaConfig schema, int sqlType, String origSQL,
              String charset, ServerConnection sc, LayerCachePool cachePool) throws SQLNonTransientException {
    
          //对应schema标签checkSQLschema属性,把表示schema的字符去掉
          if (schema.isCheckSQLSchema()) {
              origSQL = RouterUtil.removeSchema(origSQL, schema.getName());
          }
    
          /**
         * 处理一些路由之前的逻辑
         * 全局序列号,父子表插入
         */
          if ( beforeRouteProcess(schema, sqlType, origSQL, sc) ) {
              return null;
          }
    
          /**
           * SQL 语句拦截
           */
          String stmt = MycatServer.getInstance().getSqlInterceptor().interceptSQL(origSQL, sqlType);
          if (!origSQL.equals(stmt) && LOGGER.isDebugEnabled()) {
              LOGGER.debug("sql intercepted to " + stmt + " from " + origSQL);
          }
    
    
          RouteResultset rrs = new RouteResultset(stmt, sqlType);
    
    
      //......省略代码
        
          /**
           * 检查是否有分片
           */
          if (schema.isNoSharding() && ServerParse.SHOW != sqlType) {
              rrs = RouterUtil.routeToSingleNode(rrs, schema.getDataNode(), stmt);
          } else {
              RouteResultset returnedSet = routeSystemInfo(schema, sqlType, stmt, rrs);
              if (returnedSet == null) {
                  rrs = routeNormalSqlWithAST(schema, stmt, rrs, charset, cachePool,sqlType,sc);
              }
          }
    
          return rrs;
      }
    
      /**    
    
  • 【3-6】路由的前置处理

    【AbstractRouteStrategy.java】
    /**
       * 路由之前必要的处理
       * 主要是全局序列号插入,还有子表插入
       */
      private boolean beforeRouteProcess(SchemaConfig schema, int sqlType, String origSQL, ServerConnection sc)
              throws SQLNonTransientException {
          
          return // 处理 id 使用 全局序列号
                  RouterUtil.processWithMycatSeq(schema, sqlType, origSQL, sc)
                          //处理ER子表
                  || (sqlType == ServerParse.INSERT && RouterUtil.processERChildTable(schema, origSQL, sc))
                          //处理ID自增
                          || (sqlType == ServerParse.INSERT && RouterUtil.processInsert(schema, sqlType, origSQL, sc));
      }
    

4.获取mysql连接,执行sql

  • 1-8获取mysql的执行过程
  • 9-13发送sql到mysql的服务器,执行sql语句

5.响应sql结果

  • 1到 4 处理mysql server数据响应
  • 5到8发送插入成功结果给mysql
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章