《Mysql入門mysql的啟動過程詳解》要點(diǎn):
本文介紹了Mysql入門mysql的啟動過程詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL教程有一天,兩個不懂mysql內(nèi)核的人想去了解mysql內(nèi)核代碼,兩個人不是去調(diào)試代碼、查找資料,而是在那邊思考.因?yàn)椴涣私鈨?nèi)核,所以邊思考邊去驗(yàn)證.
?
使用的mysql代碼是5.1.7,調(diào)試環(huán)境是windows平臺下的vs2003.
?
Bingxi:“alex,你覺得mysql的啟動過程會是什么樣的呢?我們以銀行為例吧.”
Alex:“嗯,bingxi.早上銀行開門了,會先準(zhǔn)備好環(huán)境,然后開門迎客,mysql也是這樣.Mysql里面會有一個handle_connections_sockets函數(shù),這個函數(shù)就好比是個叫號機(jī),每個用戶來了都會取個號,然后就會進(jìn)行業(yè)務(wù)處理.”
代碼如下:
pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
{
? ……
? while (!abort_loop)
? {
??? select((int) max_used_connection,&readFDs,0,0,0) < 0) //有連接了則往下來執(zhí)行,否則一直等待
??? ……
??? accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),&length)? //接受請求
??? ……
??? create_new_thread(thd);
? }
? //abort_loop=1,則執(zhí)行到這里進(jìn)行推出.今天業(yè)務(wù)不處理了
}
Bingxi:“啊,這里面存在兩種可能的,1)用戶來一個就分配一個工作人員處理,2)將排號的人丟進(jìn)工作隊(duì)列,根據(jù)叫號機(jī)到指定窗口獲取服務(wù).前者的場景適合于請求量大,并且需要響應(yīng)速度特別快的情況,但是分配也會有個限制,所謂的最大連接數(shù),這樣的情況常見于互聯(lián)網(wǎng)行業(yè),相應(yīng)地我們可以看到機(jī)器的負(fù)載變化范圍特別大.同樣的,這也是它的一個弊端,假設(shè)每個業(yè)務(wù)都復(fù)雜(消耗資源型sql語句),同時處理的話,機(jī)器會支撐不住,這時候第二種方法就比較好,這種情況屬于事務(wù)性場景.”
MYSQL教程Alex:“嗯,是的.Mysql選擇的是前者,oracle提供兩種方法供選擇.我們繼續(xù)往下面的代碼看,如果我們配置了線程緩存,且有可用的緩存,則喚醒該線程,否則創(chuàng)建新的線程.”
代碼如下:
static void create_new_thread(THD *thd)
{
?
??? if (cached_thread_count > wake_thread)
??? {
????? start_cached_thread(thd);
??? }
??? else
??? {
????? if ((error=pthread_create(&thd->real_id,&connection_attrib,
??????????????????????????? handle_one_connection,
??????????????????????????? (void*) thd)))
? }
}
Bingxi:“嗯,老楊.是不是理解銀行為客戶分配了一個服務(wù)人員,在這段期間一直為該客戶服務(wù).里面有個代碼段,是一直在等用戶下命令.但是有可能網(wǎng)絡(luò),或者被kill掉了,就像一個人存了100,不斷取1塊錢一樣,被保安帶走了.”
代碼如下:
pthread_handler_t handle_one_connection(void *arg)
{
??? while (!net->error && net->vio != 0 &&
?????????? !(thd->killed == THD::KILL_CONNECTION))
??? {
????? net->no_send_error= 0;
????? if (do_command(thd))
?????? break;
??? }
}
Alex:“嗯,獲取命令,然后執(zhí)行命令.在dispatch_command函數(shù)中,根據(jù)不同的客戶請求進(jìn)行響應(yīng)的處理,比如開賬戶、存錢等”
代碼如下:
bool do_command(THD *thd)
{
?
? if ((packet_length=my_net_read(net)) == packet_error) //獲取命令
?
? DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
}
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/3515.html