時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
MySQL數(shù)據(jù)庫線程緩沖池的相關(guān)知識(shí)是本文我們主要要介紹的內(nèi)容,MySQL數(shù)據(jù)庫支持線程緩存,在多線程連接模式下,如果連接斷開后,將這個(gè)線程放入空閑線程緩沖區(qū),在下次有連接到來時(shí),先去緩沖池中查找是否有空閑線程,有則用之,無則創(chuàng)建。啟動(dòng)時(shí)可以設(shè)置線程緩沖池的數(shù)目:Mysqld.exe --thread_cache_size=10。
在一個(gè)連接斷開時(shí),會(huì)調(diào)用cache_thread函數(shù),將空閑的線程加入到cache中,以備后用。源碼如下:
- static?bool?cache_thread() ?
- { ?
- safe_mutex_assert_owner(&LOCK_thread_count); ?
- if?( ?
- cached_thread_count?<?thread_cache_size?
- && ?
- !?abort_loop?&&?!kill_cached_threads) ?
- { ?
- /*?Don't?kill?the?thread,?just?put?it?in?cache?for?reuse?*/ ?
- DBUG_PRINT("info",?("Adding?thread?to?cache")); ?
- cached_thread_count++; ?
- while?(!abort_loop?&&?!?wake_thread?&&?!?kill_cached_threads) ?
- (void)?pthread_cond_wait(&COND_thread_cache,?&LOCK_thread_count); ?
- cached_thread_count--; ?
- if?(kill_cached_threads) ?
- pthread_cond_signal(&COND_flush_thread_cache); ?
- if?(wake_thread) ?
- { ?
- THD?*thd; ?
- wake_thread--; ?
- thd=?thread_cache.get(); ?
- thd->thread_stack=?(char*)?&thd;????//?For?store_globals ?
- (void)?thd->store_globals(); ?
- /* ?
- THD::mysys_var::abort?is?associated?with?physical?thread?rather ?
- than?with?THD?object.?So?we?need?to?reset?this?flag?before?using ?
- this?thread?for?handling?of?new?THD?object/connection. ?
- */ ?
- thd->mysys_var->abort=?0; ?
- thd->thr_create_utime=?my_micro_time(); ?
- threads.append(thd); ?
- return(1); ?
- } ?
- } ?
- return(0); ?
- }?
上面我們的啟動(dòng)參數(shù)設(shè)置線程緩沖區(qū)為10,此時(shí)對應(yīng)代碼里面的thread_cache_size = 10,cached_thread_count記錄
了此刻cache中的空閑線程數(shù)目,只有在cache未滿的情況下,才會(huì)將新的空閑線程加入緩沖池中。加入到緩沖區(qū)其實(shí)就是將線
程掛起,pthread_cond_wait函數(shù)便是線程等待函數(shù),在此函數(shù)中,會(huì)調(diào)用WaitForMultipleObjects進(jìn)行事件等待。具體源碼
如下:
- int?pthread_cond_timedwait(pthread_cond_t?*cond,?pthread_mutex_t?*mutex, ?
- struct?timespec?*abstime) ?
- int?result; ?
- long?timeout;? ?
- union?ft64?now; ?
- if(?abstime?!=?NULL?) ?
- { ?
- GetSystemTimeAsFileTime(&now.ft); ?
- /* ?
- Calculate?time?left?to?abstime ?
- -?subtract?start?time?from?current?time(values?are?in?100ns?units) ?
- -?convert?to?millisec?by?dividing?with?10000 ?
- */ ?
- timeout=?(long)((abstime->tv.i64?-?now.i64)?/?10000); ?
- /*?Don't?allow?the?timeout?to?be?negative?*/ ?
- if?(timeout?<?0) ?
- timeout=?0L; ?
- /* ?
- Make?sure?the?calucated?timeout?does?not?exceed?original?timeout ?
- value?which?could?cause?"wait?for?ever"?if?system?time?changes ?
- */ ?
- if?(timeout?>?abstime->max_timeout_msec) ?
- timeout=?abstime->max_timeout_msec; ?
- } ?
- else ?
- { ?
- /*?No?time?specified;?don't?expire?*/ ?
- timeout=?INFINITE; ?
- } ?
- /*? ?
- Block?access?if?previous?broadcast?hasn't?finished. ?
- This?is
關(guān)鍵詞標(biāo)簽:MySQL,數(shù)據(jù)庫
相關(guān)閱讀
熱門文章 Xbox Game Pass 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié)
人氣排行 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯(cuò)誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實(shí)際操作步驟匯總 MySQL無法啟動(dòng)、無法停止各種解決方法總結(jié) 三種常用的MySQL建表語句