MySQL数据库线程缓冲池详解

MySQL数据库线程缓冲池的相关知识是本文我们主要要介绍的内容,MySQL数据库支持线程缓存,在多线程连接模式下,如果连接断开后,将这个线程放入空闲线程缓冲区,在下次有连接到来时,先去缓冲池中查找是否有空闲线程,有则用之,无则创建。启动时可以设置线程缓冲池的数目:Mysqld.exe –thread_cache_size=10。

在一个连接断开时,会调用cache_thread函数,将空闲的线程加入到cache中,以备后用。源码如下:

 

  1. static bool cache_thread()  
  2. {  
  3. safe_mutex_assert_owner(&LOCK_thread_count);  
  4. if (  
  5. cached_thread_count < thread_cache_size 
  6. &&  
  7. ! abort_loop && !kill_cached_threads)  
  8. {  
  9. /* Don't kill the thread, just put it in cache for reuse */  
  10. DBUG_PRINT("info", ("Adding thread to cache"));  
  11. cached_thread_count++;  
  12. while (!abort_loop && ! wake_thread && ! kill_cached_threads)  
  13. (void) pthread_cond_wait(&COND_thread_cache, &LOCK_thread_count);  
  14. cached_thread_count--;  
  15. if (kill_cached_threads)  
  16. pthread_cond_signal(&COND_flush_thread_cache);  
  17. if (wake_thread)  
  18. {  
  19. THD *thd;  
  20. wake_thread--;  
  21. thdthread_cache.get();  
  22. thd->thread_stack= (char*) &thd;          // For store_globals  
  23. (void) thd->store_globals();  
  24. /*  
  25. THD::mysys_var::abort is associated with physical thread rather  
  26. than with THD object. So we need to reset this flag before using  
  27. this thread for handling of new THD object/connection.  
  28. */  
  29. thd->mysys_var->abort0;  
  30. thd->thr_create_utimemy_micro_time();  
  31. threads.append(thd);  
  32. return(1);  
  33. }  
  34. }  
  35. return(0);  

 

上面我们的启动参数设置线程缓冲区为10,此时对应代码里面的thread_cache_size = 10,cached_thread_count记录

了此刻cache中的空闲线程数目,只有在cache未满的情况下,才会将新的空闲线程加入缓冲池中。加入到缓冲区其实就是将线

程挂起,pthread_cond_wait函数便是线程等待函数,在此函数中,会调用WaitForMultipleObjects进行事件等待。具体源码

如下:

 

  1. int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,  
  2. struct timespec *abstime)  
  3. int result;  
  4. long timeout;   
  5. union ft64 now;  
  6. if( abstime != NULL )  
  7. {  
  8. GetSystemTimeAsFileTime(&now.ft);  
  9. /*  
  10. Calculate time left to abstime  
  11. - subtract start time from current time(values are in 100ns units)  
  12. - convert to millisec by dividing with 10000  
  13. */  
  14. timeout= (long)((abstime->tv.i64 - now.i64) / 10000);  
  15. /* Don't allow the timeout to be negative */  
  16. if (timeout < 0)  
  17. timeout0L;  
  18. /*  
  19. Make sure the calucated timeout does not exceed original timeout  
  20. value which could cause "wait for ever" if system time changes  
  21. */  
  22. if (timeout > abstime->max_timeout_msec)  
  23. timeoutabstime->max_timeout_msec;  
  24. }  
  25. else  
  26. {  
  27. /* No time specified; don't expire */  
  28. timeoutINFINITE;  
  29. }  
  30. /*   
  31. Block access if previous broadcast hasn't finished.  
  32. This is just for safety and should normally not  
  33. affect the total time spent in this function.  
  34. */  
  35. WaitForSingleObject(cond->broadcast_block_event, INFINITE);  
  36. EnterCriticalSection(&cond->lock_waiting);  
  37. cond->waiting++;  
  38. LeaveCriticalSection(&cond->lock_waiting);  
  39. LeaveCriticalSection(mutex);  
  40. resultWaitForMultipleObjects(2, cond->events, FALSE, timeout);  
  41. EnterCriticalSection(&cond->lock_waiting);  
  42. cond->waiting--;  
  43. if (cond->waiting == 0)  
  44. {  
  45. /*  
  46. We're the last waiter to be notified or to stop waiting, so  
  47. reset the manual event.   
  48. */  
  49. /* Close broadcast gate */  
  50. ResetEvent(cond->events[BROADCAST]);  
  51. /* Open block gate */  
  52. SetEvent(cond->broadcast_block_event);  
  53. }  
  54. LeaveCriticalSection(&cond->lock_waiting);  
  55. EnterCriticalSection(mutex);  
  56. return result == WAIT_TIMEOUT ? ETIMEDOUT : 0;  

 

此处是等待时间,何处进行事件通知呢?我们再次来到上篇所提及的为新的连接创建线程的代码中:

 

  1. void create_thread_to_handle_connection(THD *thd)  
  2. {  
  3. if (cached_thread_count > wake_thread)  
  4. {  
  5. /* Get thread from cache */  
  6. thread_cache.append(thd);  
  7. wake_thread++;  
  8. pthread_cond_signal(&COND_thread_cache);  
  9. }  
  10. Else  
  11. ...  

 

关于MySQL数据库线程缓冲池的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. 如何检查MySQL数据库的主从延时?
  2. MySQL数据库时间类型的物理存储
  3. Linux cron执行MySQL失败的问题解决方案
  4. PHP与MySQL数据库中排序的对比及使用条件详解
  5. MySQL性能优化之使用Limit关键字来避免全表扫描

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/296527.html<

(0)
运维的头像运维
上一篇2025-05-22 01:25
下一篇 2025-05-22 01:26

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注