MySQLサーバ接続手順の概要

3297 ワード

mysqldはMySQLサーバー側のメインプロセスであり、mysqldはMySQLの真のコアと言える.すべての仕事はmysqldプロセスをめぐって行われている.だからmysqlという巨大なものを解剖するには、mysqldのコードが最高の突破口です.
すべてはよく知っているmain()関数から始まりますが、実はmysqld_から始まります.main()関数から始まります.これらのコードはmysqldにあります.cc.mysqld_main()はwin_を呼び出しましたmain)().win_main()関数は主に初期化の仕事をしています.
初期化作業が完了すると、MySQLは接続を受け入れる準備ができています.そして私たちの主役Handle_connections_methods()関数が登場しました.この関数の主な仕事は,TCP/IP,ネーミングパイプ,共有メモリの3つの方式の接続をそれぞれ受け入れる3つのサブプロセスを新規作成することである.一般的にお客様はTCP/IP(socket)でMySQLサーバに接続していますが、これは最も弾力性のある通信方式です.しかし,組み込みソフトウェアの応用環境では,後の2つの通信方式を採用する必要がある.
簡略化されたhandle_connections_methods()関数:
 
  
static void handle_connections_methods()
{
  mysql_mutex_lock(&LOCK_thread_count);
  mysql_cond_init(key_COND_handler_count, &COND_handler_count, NULL);
  handler_count=0;
  handler_count++;
  mysql_thread_create(key_thread_handle_con_namedpipes, &hThread, &connection_attrib, handle_connections_namedpipes, 0));
  handler_count++;
  mysql_thread_create(key_thread_handle_con_sockets, &hThread, &connection_attrib, handle_connections_sockets_thread, 0));
  handler_count++;
  mysql_thread_create(key_thread_handle_con_sharedmem, &hThread, &connection_attrib, handle_connections_shared_memory, 0))
  while (handler_count > 0)
    mysql_cond_wait(&COND_handler_count, &LOCK_thread_count);
  mysql_mutex_unlock(&LOCK_thread_count);
}

3つのスレッドを新規作成した後、handle_connectins_methods()関数は、3つの接続スレッドがすべて終了するまで長いサイクルに入ります.ここでは主にsocketの接続スレッドを見てみましょう.私たちの研究対象はこのhandleです.connections_sockets_thread.このスレッドは自分を初期化した後、handleを直接呼び出しました.connections_sockets();
handle_connections_sockets()関数はselect()を使用してmysqldを傍受するポートを呼び出し、クライアントの接続を待つ.クライアントが接続されると、この関数にTHDタイプの変数が新規作成されます.この変数は「交際花」で、接続の確立からSQL構文解析、クエリー実行、結果の戻りなどです.この変数はずっとありますが、とにかくこれは非常に重要な変数です.
そしてstruct st_vioという構造体、この構造体はコマンドの中継局です.「交際花」THDにおいてもvio型の構造体が定義されている.この構造体の機能は,ソケットから通信内容を読み出し,THDのvio変数に自分の値を割り当てることである.VIOタイプには、要求の内容、時間、要求されたソケットアドレスなど、1回の要求が詳細に記載されている.その後起こったことは、この「交際花」をサービススレッドに渡すことです.create_thread_to_handle_Connection()はこの機能を実現します.
以下は削除後のコードです
 
  
void create_thread_to_handle_connection(THD *thd)
{
  if (cached_thread_count > wake_thread)
  {
    mysql_cond_signal(&COND_thread_cache);
  }
  else
  {
    mysql_thread_create(key_thread_one_connection, &thd->real_id, &connection_attrib, handle_one_connection, (void*) thd)));   
  }
}

この関数は、アイドルのキャッシュ・スレッドがあるかどうかを確認します(MySQLは、接続が切断されたサービス・スレッドをすぐに破棄するのではなく、キャッシュ・スレッドを使用している場合は、ない場合は新しいスレッドを作成して接続をサービスします.これで、1つの接続がサービススレッドに入り、接続スレッドが戻って接続を待機します.
后の内容はすべてサービススレッドの中で実现して、《MySQLを深く理解します》の中でとても详しいコードの追迹があって、兴味のある学友は见ることができます.私は関数呼び出しの順序を添付して、参考にします.
 
  
handle_one_connection()
mysql_thread_create()
handle_one_connection()
do_handle_one_connection()
init_new_connection_thread()
init_new_connection_handler_thread()
do_command()
dispatch_command()
mysql_parse()
mysql_execuate_command()