MySQL数据库线程缓冲池详解

时间:2012-04-13 11:48:01 

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

  在一个连接断开时,会调用cache_thread函数,将空闲的线程加入到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); }

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

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

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

  如下:

  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 just for safety and should normally not affect the total time spent in this function. */ WaitForSingleObject(cond->broadcast_block_event, INFINITE); EnterCriticalSection(&cond->lock_waiting); cond->waiting++; LeaveCriticalSection(&cond->lock_waiting); LeaveCriticalSection(mutex); result= WaitForMultipleObjects(2, cond->events, FALSE, timeout); EnterCriticalSection(&cond->lock_waiting); cond->waiting--; if (cond->waiting == 0) { /* We're the last waiter to be notified or to stop waiting, so reset the manual event. */ /* Close broadcast gate */ ResetEvent(cond->events[BROADCAST]); /* Open block gate */ SetEvent(cond->broadcast_block_event); } LeaveCriticalSection(&cond->lock_waiting); EnterCriticalSection(mutex); return result == WAIT_TIMEOUT ? ETIMEDOUT : 0; }

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

  void create_thread_to_handle_connection(THD *thd) { if (cached_thread_count > wake_thread) { /* Get thread from cache */ thread_cache.append(thd); wake_thread++; pthread_cond_signal(&COND_thread_cache); } Else ... }

  关于MySQL数据库线程缓冲池的相关知识就介绍到这里了O(∩_∩)O~

标签:缓冲,mysql
0
投稿

猜你喜欢

  • 微信小程序(微信应用号)开发工具0.9版安装详细教程

    2023-06-12 23:33:37
  • golang mysql的连接池的具体使用

    2024-01-14 11:52:10
  • Python面试不修改数组找出重复的数字

    2023-08-07 05:04:16
  • Ubuntu 18.04安装mysql 5.7.23

    2024-01-28 19:44:13
  • python3.x 生成3维随机数组实例

    2021-04-11 04:02:43
  • 使用PYTHON解析Wireshark的PCAP文件方法

    2022-12-26 06:04:00
  • mysql insert 存在即不插入语法说明

    2024-01-17 18:46:05
  • TF-IDF算法解析与Python实现方法详解

    2021-12-28 02:38:47
  • VBScript中的eval()函数

    2008-04-09 13:41:00
  • golang gorm中格式化时间问题详解

    2023-07-12 09:45:21
  • Python OpenCV对本地视频文件进行分帧保存的实例

    2021-09-15 23:03:18
  • 如何学习Python time模块

    2023-07-30 17:14:59
  • 对django中foreignkey的简单使用详解

    2021-09-04 21:04:20
  • ACCESS 2007出现“错误 '80040e14'“

    2008-06-19 13:21:00
  • Python中is与==的使用区别详解

    2023-10-15 04:08:21
  • 你真的知道怎么优化SQL吗

    2024-01-23 02:59:23
  • PyTorch 迁移学习实践(几分钟即可训练好自己的模型)

    2021-09-07 23:37:31
  • Python快速实现分列转到行的示例代码

    2021-08-13 09:14:11
  • Python中re模块常用方法总结分析

    2022-10-27 14:40:20
  • asp(JavaScript)自动判断网页编码并转换的代码

    2011-03-03 11:19:00
  • asp之家 网络编程 m.aspxhome.com