Navicat for MySQL sqlファイルプロセス分析(データインポート)


たとえば、インポートするファイルの内容は次のとおりです.
INSERT INTO `es_goods_community` (`id`, `goods_id`, `community_id`, `status`, `seller_id`) VALUES (8741, 424, 4, 1, 24);
INSERT INTO `es_goods_community` (`id`, `goods_id`, `community_id`, `status`, `seller_id`) VALUES (8742, 424, 5, 1, 24);

Nativecatクライアントは、次のパッケージをmycaに送信します.
  • COM_QUERYタイプ、コマンドは:SET NAMES utf 8;
  • COM_QUERYタイプ、コマンド:SET AUTOMMIT=0;
  • COM_QUERYタイプ、コマンド:
  • INSERT INTO `es_goods_community` (`id`, `goods_id`, `community_id`, `status`, `seller_id`) VALUES (8741, 424, 4, 1, 24);
    INSERT INTO `es_goods_community` (`id`, `goods_id`, `community_id`, `status`, `seller_id`) VALUES (8742, 424, 5, 1, 24);

  • ここでは、ファイルの内容が多い場合は、パケット処理します.でもここはマルチマルチマルチstatement.
  • COM_QUERYタイプ、コマンドは:COMMIT;またはrollback;
  • COM_QUERYタイプ、コマンド:SET AUTOMMIT=1;

  • 1、SETコマンド実行
    SETコマンドは、主にmycatフロントエンド接続、すなわちmysqlクライアント--』mycatフロントエンド接続を実行し、フロントエンド接続に対応する属性を設定し、設定成功(OKパケット)に戻ればよい.
    2、COM_QUERY multi_statment insert文の実行フロー
    まずSQL文の解析を行い、複数のinsert文を単一の文に変換し、ルーティングを計算し、どのスライス上にあるかを導出し、対応するスライス上で文を実行します.このステップには重要な操作があり、今回接続したNonBlockingSessionにどのスライス上で文を実行したかを記録し、commit文の処理を容易にします.ルーティング解析はここではまだ深く分析されていません.私の後続の博文「ルーティング解析編」に注目してください.
    3、COMMIT;コマンド実行
    このコマンドの処理は,第2ステップでどのスライスノードで文を実行したかに基づいて,対応するスライス上でcommitコマンドを実行し,トランザクションをコミットする目的を達成する.
    ここで重要な点を簡単に説明します.commit文にはルーティング情報が含まれていません.mycatはどのようにcommitを適切なdatanodeに転送して実行しますか.mycatはこの問題を処理し,各フロントエンド接続(ServerConnection)にはクエリーHander(QueryHandler)があり,各QueryHanlderにはNonBlockingSessionがあり,完全なコマンド処理中にはNonBlockingSessionは、各ルーティングノード(実行されたスライスノード)とバックエンドに接続されたBackConnectionとの対応関係(ConcurrentHashMap target;このデータ構造はメソッド時にデータを追加し、ソース(PhysicalDatasource.getConnection)メソッドを追跡し、キーは内部でcreateNewConnectionを呼び出し、そのコールバックメソッドconnectionAcquired)、フロントエンド接続がバックエンド接続を使用する場合、このメソッドを呼び出して関係の維持を完了し、commitコマンドが到来すると、正しいバックエンド接続に送信して実行します.
    /**
    
         * @return previous bound connection
    
         */
    public BackendConnection bindConnection(RouteResultsetNode key,
    
                                                BackendConnection conn) {
    
            // System.out.println("bind connection "+conn+
    
            // " to key "+key.getName()+" on sesion "+this);
    
            return target.put(key, conn);
    
    }

    4、set autocommit=1; デフォルトの自動コミットに接続を復元します.
    本稿では、これまで具体的なルーティングアルゴリズムの解析について詳しく説明していませんが、後続のブログに注目してください.commitコマンドの実行手順を簡単に説明します.