首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 啟動流程源碼級解析:從 handle_connections_sockets 到 dispatch_command 的完整鏈路

     編輯:MySQL 資料庫相關知識

基於 MySQL 5.1.7 原始碼(Windows VS2003 調試),以銀行櫃台類比,逐層剖析 MySQL 啟動核心流程:監聽埠建立、連線分發、執行緒快取/建立、命令迴圈、分發執行。

核心流程圖解

  1. handle_connections_sockets:主監聽迴圈,select() 等待新連線,accept() 接受,呼叫 create_new_thread()。
  2. create_new_thread:若 cached_thread_count > wake_thread 喚醒快取執行緒(start_cached_thread),否則 pthread_create 建立新執行緒執行 handle_one_connection。
  3. handle_one_connection:執行緒主迴圈,while (!net->error && ...) 持續呼叫 do_command(),直到連線錯誤或 KILL。
  4. do_command:my_net_read() 讀取封包,解析命令碼,呼叫 dispatch_command()。
  5. dispatch_command:依命令類型(COM_QUERY、COM_CONNECT、COM_QUIT 等)分發至對應處理函數。

關鍵代碼片段

// 監聽迴圈
pthread_handler_t handle_connections_sockets(void *arg) {
  while (!abort_loop) {
    if (select((int)max_used_connection, &readFDs, 0, 0, 0) < 0) continue;
    accept(sock, (struct sockaddr*)&cAddr, &length);
    create_new_thread(thd);
  }
}

// 執行緒建立/快取
static void create_new_thread(THD *thd) {
  if (cached_thread_count > wake_thread) {
    start_cached_thread(thd);
  } else {
    pthread_create(&thd->real_id, &connection_attrib, handle_one_connection, (void*)thd);
  }
}

// 連線命令迴圈
pthread_handler_t handle_one_connection(void *arg) {
  THD *thd = (THD*)arg;
  while (!net->error && net->vio != 0 && !(thd->killed == THD::KILL_CONNECTION)) {
    net->no_send_error = 0;
    if (do_command(thd)) break;
  }
}

// 讀取封包並分發
bool do_command(THD *thd) {
  if ((packet_length = my_net_read(net)) == packet_error) return true;
  return dispatch_command((enum enum_server_command)packet[0], thd, packet+1, packet_length);
}

架構對比:MySQL vs Oracle

  • MySQL:一連線一執行緒,無連線池(社區版),高併發下執行緒切換開銷大,適用短小快查詢。
  • Oracle:提供專用伺服器(Dedicated)與共享伺服器(Shared Server/MTS)兩種模式,可配置連線池,適合長交易、高併發 OLTP。
原始碼閱讀建議:
• 從 sql/mysqld.cc main() 入口追蹤初始化順序。
• 關注 THD 結構體,貫穿整個會話生命週期。
• vio 抽象網路 IO,支援 SSL、Socket、Named Pipe 多種傳輸。
• 使用 DBUG_ENTER/RETURN 宏追蹤呼叫鏈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved