成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL源碼學習之Connection Manager詳解

數據庫 MySQL
本文我們主要介紹了MySQL源碼學習之Connection Manager,它包括:連接的線程數、初始化網絡設置、連接的方式、Socket管理創新線程以及新線程處理流程的知識,希望能夠對您有所幫助。

MySQL數據庫Connection Manager的相關知識是本文我們主要要介紹到內容,接下來就讓我們一起來了解一下吧。

1.連接的線程數

MySQL支持單線程和多線程兩種連接線程數。如果是單線程,則在同一時刻,只能有一個connection連接到MySQL,其他的連接會被掛起。如果是多線程,則同一時刻可以支持多個connection同時連接到服務器。可以通過設置服務器的啟動參數來設定連接的線程數:

  1. mysqld.exe --thread-handling=no-threads  
  2. mysqld.exe --thread-handling=one-thread-per-connection 

 

服務器如何通過參數來選擇使用哪種方式的呢?且看服務器中的分支代碼:

  1. #ifdef EMBEDDED_LIBRARY  
  2. one_thread_scheduler(&thread_scheduler);  
  3. #else  
  4. if (global_system_variables.thread_handling <=  
  5. SCHEDULER_ONE_THREAD_PER_CONNECTION)  
  6. one_thread_per_connection_scheduler(&thread_scheduler);  
  7. else if (global_system_variables.thread_handling == SCHEDULER_NO_THREADS)  
  8. one_thread_scheduler(&thread_scheduler);  
  9. else  
  10. pool_of_threads_scheduler(&thread_scheduler); /* purecov: tested */  
  11. #endif 

 

這段代碼出現在get_options函數中,此函數是根據傳入的服務器參數,設置相應參數的模式。由這段代碼可以看出,如果定義了EMBEDDED_LIBRARY宏定義(估計應該是嵌入式使用),則調用one_thread_scheduler,即使用單線程。如果參數小于等于SCHEDULER_ONE_THREAD_PER_CONNECTION,則調用one_thread_per_connection_scheduler,即每個連接一個線程,即多線程。

至于global_system_variables.thread_handling是如何進行設置的呢?其實就是根據我們傳遞給服務器的參數--thread-handling進行設置的,參數的設置統一在函數get_options中,其調用mysqld_get_one_option,其中有個分支,代碼如下:

 

  1. case OPT_THREAD_HANDLING:  
  2. {  
  3. global_system_variables.thread_handling=  
  4. find_type_or_exit(argument, &thread_handling_typelib, opt->name)-1;  
  5. break;  

 

對參數初始化有興趣的可以具體的看下get_options這個函數,這里就不詳細講解了。 我們來看下one_thread_scheduler和one_thread_per_connection_scheduler的源代碼,看下他們都做了些什么?

 

  1. void one_thread_scheduler(scheduler_functions* func)  
  2. {  
  3. func->max_threads1;  
  4. #ifndef EMBEDDED_LIBRARY  
  5. func->add_connectionhandle_connection_in_main_thread;  
  6. #endif  
  7. func->init_new_connection_threadinit_dummy;  
  8. func->end_threadno_threads_end;  
  9. }  
  10.  
  11. void one_thread_per_connection_scheduler(scheduler_functions* func)  
  12. {  
  13. func->max_threadsmax_connections;  
  14. func->add_connectioncreate_thread_to_handle_connection;  
  15. func->end_threadone_thread_per_connection_end;  
  16. }  

 

原來就是設置了一個結構體中scheduler_functions的參數,只不過這些參數是一些函數指針罷了,也就是說在具體的調用中,

只需要調用add_connection或end_thread即可,不需要知道到底是調用了哪個函數,這大概就是一種變形的多態性吧。

2.初始化網絡配置

網絡配置比較簡單,就是設置端口,創建套接字,綁定端口,監聽端口。實現全部集中在network_init函數中,由于這個函數確

實沒什么好講的,如果對socket不熟悉的話,可以去網上搜索下相關知識。這里直接給出相應的偽代碼:

 

  1. network_init  
  2. {  
  3. set_ports; //設置端口號,#define MYSQL_PORT 3306  
  4. socket; //創建套接字  
  5. bind; //綁定端口號  
  6. listen; //監聽端口號  

 

3.連接的方式

進程間通信的方式不止是SOCKET,還有其他很多方式。Mysql支持三種連接方式:namepipe、socket和shared memory,即命名管道、套接字和共享內存的方式。這三種方式是可以共存的。默認只使用套接字。

TCP/IP套接字方式是MySQL在任何平臺下都提供的連接方式,也是網絡中使用得最多的一種方式。這種方式在TCP/IP連接上建立一個基于網絡的連接請求,一般情況下客戶端在一臺服務器上,而MySQL實例在另一臺服務器上,這兩臺機器通過一個TCP/IP網絡連接。

例如,我可以在Windows服務器下請求一臺遠程Linux服務器下的MySQL實例。在Windows 2000、Windows XP、Windows 2003和Windows Vista以及在此之后的 Windows操作系統中,如果兩個需要通信的進程在同一臺服務器上,那么可以使用命名管道,SQL Server數據庫默認安裝后的本地連接也使用命名管道。在MySQL數據庫中,需在配置文件中啟用--enable-named-pipe選項。

在MySQL 4.1之后的版本中,MySQL還提供了共享內存的連接方式,在配置文件中添加--shared-memory。如果想使用共享內存的方式,在連接時,Mysql客戶端還必須使用-protocol=memory選項。啟動時可以通過下面的參數進行設置。

 

  1. mysqld.exe --enable-named-pipe  
  2. mysqld.exe --shared-memory 

 

除了在啟動時進行參數設置外,也可以通過修改MY.INI文件進行設置。我們來看下源碼中選擇連接方式的分支函數handle_connections_methods:

 

  1. handle_connections_methods()  
  2. {  
  3. if (hPipe != INVALID_HANDLE_VALUE)  
  4. {  
  5. handler_count++;  
  6. if (pthread_create(&hThread,&connection_attrib,  
  7. handle_connections_namedpipes, 0))  
  8. {  
  9. sql_print_warning("Can't create thread to handle named pipes");  
  10. handler_count--;  
  11. }  
  12. }  
  13. if (have_tcpip && !opt_disable_networking)  
  14. {  
  15. handler_count++;  
  16. if (pthread_create(&hThread,&connection_attrib,  
  17. handle_connections_sockets, 0))  
  18. {  
  19. sql_print_warning("Can't create thread to handle TCP/IP");  
  20. handler_count--;  
  21. }  
  22. }  
  23.  
  24. if (opt_enable_shared_memory)  
  25. {  
  26. handler_count++;  
  27. if (pthread_create(&hThread,&connection_attrib,  
  28. handle_connections_shared_memory, 0))  
  29. {  
  30. sql_print_warning("Can't create thread to handle shared memory");  
  31. handler_count--;  
  32. }  
  33. }  

 

由于對于namepipe和memory share的通信方式不太了解,這里只研究socket的通信方式。從代碼中可以看出,handle_connections_sockets便是socket的設置,我們就來看下它。

4.socket管理創建新線程

socket管理其實比較簡單,直接給出其偽代碼:

 

  1. handle_connections_sockets  
  2. {  
  3. select; //監視socket文件描述符  
  4. new_socket = accept;//處理到來的客戶端連接  
  5. thd = new THD;創建THD類  
  6. vio_tmp = vio_new(new_socket,VIO_TYPE_TCPIP, 0); //初始化VIO結構體  
  7. my_net_init(&thd->net, vio_tmp);//初始化thd的net結構體  
  8. create_new_thread(thd);//為這個連接創建一個新的線程,如果是單線程模式的話,就不會創建一個新線程  

 

首先是select函數進行監視socket端口,如果監控到有連接,則通過accept函數接受客戶端的連接,然后新建一個THD類,將連接參數全部設置到THD類的參數上,最后調用create_new_thread函數,這個函數便是重點。 我們進入這個函數,看下做了啥。

 

  1. create_new_thread  
  2. {  
  3. ++connection_count;//全局連接數自增  
  4. thread_count++; //全局線程數自增  
  5. thread_scheduler.add_connection(thd);//真正創建線程  

 

So easy,首先將全局連接數+1,全局線程數+1,然后調用add_connection函數,這個函數就是我們在上面第一步設置連接的

線程數中,one_thread_scheduler和one_thread_per_connection_scheduler中設置的一個參數。這兩者的區別便是是否創建了

一個新的線程來處理到來的連接。one_thread_scheduler是單線程方式,木有新建線程。我們重點研究one_thread_per_connection_scheduler,其設置的add_connection函數為create_thread_to_handle_connection:

 

  1. create_thread_to_handle_connection(THD *thd)  
  2. {  
  3. thread_created++;  
  4. threads.append(thd); // 創建線程數自增,并加入到threads鏈表上  
  5. pthread_create(&thd->real_id,&connection_attrib,  
  6. handle_one_connection,  
  7. (void*) thd);//這就是真正創建線程的地方了,函數便是handle_one_connection  

 

可見,最后調用了pthread_create函數,這個函數便是創建一個新的線程,新線程的處理函數為handle_one_connection.

5.新線程處理流程

新線程處理函數為handle_one_connection,到此位置,一個新的connection被一個新創建的線程所單獨處理。我們看下其中

是如何進行處理的。

 

  1. handle_one_connection(void *arg)  
  2. {  
  3. for (;;)  
  4. {  
  5. lex_start(thd); //初始化詞法分析結構體  
  6. login_connection(thd); //用戶認證,失敗報錯  
  7. prepare_new_connection_state(THD* thd);//Initialize THD to handle queries  
  8. while (!net->error && net->vio != 0 && //循環處理command  
  9. !(thd->killed == THD::KILL_CONNECTION))  
  10. {  
  11. if (do_command(thd))  
  12. break; //處理失敗跳出  
  13. }  
  14. end_connection(thd); //關閉連接  
  15. close_connection(thd, 0, 1);  
  16. thread_scheduler.end_thread(thd,1);//結束線程  
  17. return 0;  
  18. }  

 

首先進行了詞法分析結構體的初始化,然后進行用戶認證,認證成功后通過do_command循環執行客戶端發過來的命令。

6.總結

整個connection manager的流程十分清晰,單線程的連接一般很少使用,大多使用多線程方式。多線程連接中其實還涉及到線程緩沖池的概念,即如果一個連接斷開后,其所創建的線程不會被銷毀掉,而是放到緩沖池中,等待下一個新的connection到來時,首先去線程緩沖池查找是否有空閑的線程,有的話直接使用,木有的話才去創建新的線程來管理這個connection。

關于MySQL數據庫Connection Manager的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!

【編輯推薦】

  1. MySQL數據庫my.cnf配置文件注釋詳解
  2. SQL Server數據庫復制失敗的原因及解決方案
  3. SQL Server 2005數據庫游標調用函數實例解析
  4. MySQL數據庫中EXPLAIN的使用及其注意事項詳解
  5. SQL Server數據庫用視圖來處理復雜的數據查詢關系
責任編輯:趙鵬 來源: 博客園
相關推薦

2022-10-09 08:53:06

存儲容量SSD

2011-06-23 13:10:39

Python 對象機制

2011-04-22 14:14:21

MySQL偷窺線程

2009-07-08 13:22:30

JDK源碼分析Set

2021-09-02 07:00:01

Glide流程Android

2023-03-15 16:16:07

鴻蒙Server端

2017-06-07 14:58:39

Redis源碼學習Redis事務

2011-08-25 15:41:42

Lua源碼

2023-02-08 15:32:56

新模塊操作系統

2021-09-07 06:40:25

AndroidLiveData原理

2022-03-29 08:31:18

RabbitMQMQ客戶端

2021-09-12 07:30:10

配置

2011-06-23 14:05:32

Qt 事件機制

2017-04-07 14:30:26

2023-07-10 08:43:53

SpringIDEA

2016-09-20 10:15:49

LaravelPHPContainer

2023-03-07 10:43:52

AndroidFramework測試

2016-09-20 10:26:25

LaravelPHPMiddleware

2019-01-04 15:14:18

2019-02-12 15:04:09

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本一级淫片免费啪啪3 | 免费毛片网站 | 久久精品亚洲一区二区三区浴池 | 91精品国产91久久久久久最新 | 国产一区二区三区在线视频 | 成人九区 | 久久久久午夜 | 亚洲一区 | 免费观看日韩精品 | 九九免费 | 成人午夜在线 | av网站在线播放 | 亚洲国产专区 | 久草资源网站 | 成人毛片网站 | 天天看天天干 | 99精品国产一区二区三区 | 精品自拍视频 | 欧美在线一区二区视频 | 色黄爽| 日本a网站| 日韩高清在线观看 | 美女午夜影院 | 91精品国产91久久久久久吃药 | 91人人爽 | 亚洲在线电影 | 国产xxxx在线 | 国产成人免费视频 | 亚洲精品粉嫩美女一区 | www国产成人免费观看视频,深夜成人网 | 美女久久视频 | 欧美一区 | 久久美女网 | 精品一区二区三区免费毛片 | av色噜噜 | 久久av一区二区三区 | 亚洲精品一区二区三区中文字幕 | 精品96久久久久久中文字幕无 | 一区二区三区视频在线观看 | www一级片| 亚洲国产精品精华素 |