(一)服务器/客户端版本
1. 入口点:
handle_connections_sockets()函数
我们在此要用实例程序做实验,学习Mysql服务器所使用的两种事件监听技术:select和poll同时介绍更给力的事件监听技术epoll和libevent。
代码SVN地址:
2. 线程策略:
Mysql支持 单线程和多线程 两种连接线程数。
如果是单线程,则在同一时刻,只能有一个connection连接到Mysql,其他的连接会被挂起。
如果是多线程,则同一时刻可以支持多个connection同时连接到服务器。
一般单线程的方式很少采用。
多线程的方式中,采用了线程缓冲池的策略。
即如果一个连接断开后,其所创建的线程不会被销毁掉,而是放到缓冲池中,等待下一个新的connection到来时,首先去线程缓冲池查找是否有空闲的线程,有的话直接使用,没有的话才去创建新的线程来管理这个connection。
可以通过设置服务器的启动参数来设定连接的线程数:
mysqld.exe --thread-handling=no-threads mysqld.exe --thread-handling=one-thread-per-connection 我们查看相关代码: 目前就两种类型,如下 enum scheduler_types { SCHEDULER_ONE_THREAD_PER_CONNECTION=0, SCHEDULER_NO_THREADS, SCHEDULER_TYPES_COUNT }; get_options()函数里面: 嵌入式数据库,肯定是用单线程。 服务器版本,则根据命令行参数决定采用单线程或者每连接一个线程。 #ifdef EMBEDDED_LIBRARY one_thread_scheduler(); #else if (thread_handling <= SCHEDULER_ONE_THREAD_PER_CONNECTION) one_thread_per_connection_scheduler(); else /* thread_handling == SCHEDULER_NO_THREADS) */ one_thread_scheduler(); #endif