Navicat for MySQL sqlファイルプロセス分析(データインポート)
2459 ワード
たとえば、インポートするファイルの内容は次のとおりです.
Nativecatクライアントは、次のパッケージをmycaに送信します. COM_QUERYタイプ、コマンドは:SET NAMES utf 8; COM_QUERYタイプ、コマンド:SET AUTOMMIT=0; COM_QUERYタイプ、コマンド:
ここでは、ファイルの内容が多い場合は、パケット処理します.でもここはマルチマルチマルチ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コマンドが到来すると、正しいバックエンド接続に送信して実行します.
4、set autocommit=1; デフォルトの自動コミットに接続を復元します.
本稿では、これまで具体的なルーティングアルゴリズムの解析について詳しく説明していませんが、後続のブログに注目してください.commitコマンドの実行手順を簡単に説明します.
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に送信します.
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.
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コマンドの実行手順を簡単に説明します.