数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

MySQL数据库线程缓沖池详解


发布日期:2021年02月07日
 
MySQL数据库线程缓沖池详解

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

在一个连接断开时会调用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)
            {
            /* Dont 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_cacheget();
            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= ;
            thd>thr_create_utime= my_micro_time();
            threadsappend(thd);
            return();
            }
            }
            return();
            }            

上面我们的启动参数设置线程缓沖区为此时对应代码里面的thread_cache_size = 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 ft now;
            if( abstime != NULL )
            {
            GetSystemTimeAsFileTime(&nowft);
            /*
            Calculate time left to abstime
             subtract start time from current time(values are in ns units)
             convert to millisec by dividing with
            */
            timeout= (long)((abstime>tvi nowi) / );
            /* Dont allow the timeout to be negative */
            if (timeout < )
            timeout= L;
            /*
            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; dont expire */
            timeout= INFINITE;
            }
            /*
            Block access if previous broadcast hasnt 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( cond>events FALSE timeout);
            EnterCriticalSection(&cond>lock_waiting);
            cond>waiting;
            if (cond>waiting == )
            {
            /*
            Were 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 : ;
            }                              

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

                        以下是代码片段
            
            void create_thread_to_handle_connection(THD *thd)
            {
            if (cached_thread_count > wake_thread)
            {
            /* Get thread from cache */
            thread_cacheappend(thd);
            wake_thread++;
            pthread_cond_signal(&COND_thread_cache);
            }
            Else
            
            }            

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

               

上一篇:关于SQL注入的几类错误和产生

下一篇:基于SQL中的数据查询语句汇总