MySQL数据库线程缓冲池详解

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数据库线程缓冲池的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

时间: 2024-11-05 12:32:10

MySQL数据库线程缓冲池详解的相关文章

MySQL 数据库 source 命令详解及实例

MySQL 数据库 source 命令详解及实例 MySQL 数据库 source 命令,该命令是数据库导入命令.source 命令的用法非常简单,首先你需要进入 MySQL 数据库的命令行管理界面,然后选择需要导入的数据库,执行 source 命令.如下图所示. MySql 数据库 source 命令 mysql> use test Database changed mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mys

PHP4与MySQL数据库操作函数详解

mysql|函数|数据|数据库|详解 说PHP就不能不提MySQL,而要讲MySQL,那么PHP也是必然要被提起.PHP的迅速崛起,离不开MySQL,而MySQL的广泛应用,也与PHP休戚相关. 下面详细分析PHP4中与MySQL相关操作的函数(共32个,开头都为mysql_): <1>. 连接数据库服务器(database server)的函数(2个): (1).mysql_connect() 格式:int mysql_connect(string [hostname] [:port],st

java连接mysql数据库的方法详解

JDBC连接MySQL数据库 首先要下载Connector/J地址:http://www.mysql.com/downloads/connector/j/ 这是MySQL官方提供的连接方式: 解压后得到jar库文件,需要在工程中导入该库文件 我是用的是Eclipse:   JAVA连接MySQL稍微繁琐,所以先写一个类用来打开或关闭数据库:  代码如下 复制代码 DBHelper.java package com.hu.demo;    import java.sql.Connection; 

php连接mysql数据库测试实例详解

PHP连接MySQL数据库是通过 mysql_connect() 函数来打开非持久的 MySQL 连接.   语法: mysql_connect(servername, username, password);   参数说明: servername:可选.要连接的服务器名称,默认是 "localhost:3306",一般填写 localhost 即可. username:可选.登录数据库服务器的用户名,一般都是root. password:可选.登录数据库服务器的密码. 例子:    

PHP4与MySQL数据库操作函数详解(六)

  (8) 取数据库名和表名(2个):      1.mysql_list_dbs()   格式: int mysql_list_dbs(int link_identifier);   取得所有可用的数据库名(database name).      例子:      <?php   $connect = mysql_connect($host , $usr ,$pwd);   $dbs = mysql_list_dbs($connect);   $rows = mysql_num_rows($

PHP4与MySQL数据库操作函数详解(二)

  <3>.选择数据库函数(1个):      mysql_select_db()   格式:int mysql_select_db(string database name , int link_identifier);   选择指定的database name ,成功,返回1个真值(True),失败,则返回1个False值.      例子1:   <?php   $select = mysql_select_db('forum' , $connect);   if($select)

PHP4与MySQL数据库操作函数详解(一)

    说PHP就不能不提MySQL,而要讲MySQL,那么PHP也是必然要被提起.PHP的迅速崛起,离不开MySQL,而MySQL的广泛应用,也与PHP休戚相关.      下面详细分析PHP4中与MySQL相关操作的函数(共32个,开头都为mysql_):      <1>. 连接数据库服务器(database server)的函数(2个):      (1).mysql_connect()   格式:int mysql_connect(string [hostname] [:port],

PHP4 与 MySQL 数据库操作函数详解_php技巧

说PHP就不能不提MySQL,而要讲MySQL,那么PHP也是必然要被提起.PHP的迅速崛起,离不开MySQL,而MySQL的广泛应用,也与PHP休戚相关.   下面详细分析PHP4中与MySQL相关操作的函数(共32个,开头都为mysql_):   <1>. 连接数据库服务器(database server)的函数(2个):   (1).mysql_connect()   格式:int mysql_connect(string [hostname] [ort],string [usernam

PHP4 与 MySQL 数据库操作函数详解_php基础

I 说PHP就不能不提MySQL,而要讲MySQL,那么PHP也是必然要被提起.PHP的迅速崛起,离不开MySQL,而MySQL的广泛应用,也与PHP休戚相关.   下面详细分析PHP4中与MySQL相关操作的函数(共32个,开头都为mysql_):   <1>. 连接数据库服务器(database server)的函数(2个):   (1).mysql_connect()  格式:int mysql_connect(string [hostname] [ort],string [userna