@Override
  public void execute(RouteResultset rrs, int type) {
    if (LOGGER.isDebugEnabled()) {
      StringBuilder s = new StringBuilder();
      LOGGER.debug(s.append(source).append(rrs).toString());
    }

    // 检查路由结果是否为空
    RouteResultsetNode[] nodes = rrs.getNodes();
    if (nodes == null || nodes.length == 0) {
      source.writeErrMessage(ErrorCode.ER_NO_DB_ERROR, "No dataNode selected");
      return;
    }

    // 选择执行方式
    if (nodes.length == 1) {
      singleNodeExecutor.execute(nodes[0], this, rrs.getFlag());
    } else {
      // 多数据节点,非事务模式下,执行的是可修改数据的SQL,则后端为事务模式。
      boolean autocommit = source.isAutocommit();
      if (autocommit && isModifySQL(type)) {
        autocommit = false;
      }
      //   multiNodeExecutor.execute(nodes, autocommit, this, rrs.getFlag());
    }
  }
  @Override
  public void terminate() {
    // 终止所有正在执行的任务
    kill();

    // 等待所有任务结束,包括还未执行的,执行中的,执行完的。
    try {
      singleNodeExecutor.terminate();
      // multiNodeExecutor.terminate();
      commitExecutor.terminate();
      rollbackExecutor.terminate();
    } catch (InterruptedException e) {
      for (RouteResultsetNode rrn : target.keySet()) {
        Channel c = target.remove(rrn);
        if (c != null) {
          //    c.close();
        }
      }
      LOGGER.warn("termination interrupted: " + source, e);
    }

    // 清理绑定的资源
    clear(false);
  }