Mysql源码学习――Connection Manager (一)

2014-11-24 10:35:16 · 作者: · 浏览: 3

1.连接的线程数

Mysql支持单线程和多线程两种连接线程数。如果是单线程,则在同一时刻,只能有一个connection连接到Mysql,

其他的连接会被挂起。如果是多线程,则同一时刻可以支持多个connection同时连接到服务器。

可以通过设置服务器的启动参数来设定连接的线程数:

mysqld.exe --thread-handling=no-threads

mysqld.exe --thread-handling=one-thread-per-connection

  

服务器如何通过参数来选择使用哪种方式的呢?且看服务器中的分支代码:

#ifdef EMBEDDED_LIBRARY

one_thread_scheduler(&thread_scheduler);

#else

if (global_system_variables.thread_handling <=

SCHEDULER_ONE_THREAD_PER_CONNECTION)

one_thread_per_connection_scheduler(&thread_scheduler);

else if (global_system_variables.thread_handling == SCHEDULER_NO_THREADS)

one_thread_scheduler(&thread_scheduler);

else

pool_of_threads_scheduler(&thread_scheduler); /* purecov: tested */

#endif

  

这段代码出现在get_options函数中,此函数是根据传入的服务器参数,设置相应参数的模式。由这段代码可以看出,如果定义了EMBEDDED_LIBRARY宏定义(估计应该是嵌入式使用),则调用one_thread_scheduler,即使用单线程。如果参数小于等于SCHEDULER_ONE_THREAD_PER_CONNECTION,则调用one_thread_per_connection_scheduler,即每个连接一个线程,即多线程。 至于global_system_variables.thread_handling是如何进行设置的呢?其实就是根据我们传递给服务器的参数--thread-handling进行设置的,参数的设置统一在函数get_options中,其调用mysqld_get_one_option,其中有个分支,代码如下:

case OPT_THREAD_HANDLING:

{

global_system_variables.thread_handling=

find_type_or_exit(argument, &thread_handling_typelib, opt->name)-1;

break;

}

  

对参数初始化有兴趣的可以具体的看下get_options这个函数,这里就不详细讲解了。 我们来看下one_thread_scheduler和one_thread_per_connection_scheduler的源代码,看下他们都做了些什么?

void one_thread_scheduler(scheduler_functions* func)

{

func->max_threads= 1;

#ifndef EMBEDDED_LIBRARY

func->add_connection= handle_connection_in_main_thread;

#endif

func->init_new_connection_thread= init_dummy;

func->end_thread= no_threads_end;

}

void one_thread_per_connection_scheduler(scheduler_functions* func)

{

func->max_threads= max_connections;

func->add_connection= create_thread_to_handle_connection;

func->end_thread= one_thread_per_connection_end;

}

  

原来就是设置了一个结构体中scheduler_functions的参数,只不过这些参数是一些函数指针罢了,也就是说在具体的调用中,

只需要调用add_connection或end_thread即可,不需要知道到底是调用了哪个函数,这大概就是一种变形的多态性吧。

2.初始化网络配置

网络配置比较简单,就是设置端口,创建套接字,绑定端口,监听端口。实现全部集中在network_init函数中,由于这个函数确

实没什么好讲的,如果对socket不熟悉的话,可以去网上搜索下相关知识。这里直接给出相应的伪代码:

network_init

{

set_ports; //设置端口号,#define MYSQL_PORT 3306

socket;//创建套接字

bind; //绑定端口号

listen;//监听端口号

}

3.连接的方式

进程间通信的方式不止是SOCKET,还有其他很多方式。Mysql支持三种连接方式:namepipe、socket和shared memory,

即命名管道、套接字和共享内存的方式。这三种方式是可以共存的。默认只使用套接字。

TCP/IP套接字方式是MySQL在任何平台下都提供的连接方式,也是网络中使用得最多的一种方式。这种方式在TCP/IP连接上建立

一个基于网络的连接请求,一般情况下客户端在一台服务器上,而MySQL实例在另一台服务器上,这两台机器通过一个TCP/IP网络连接。

例如,我可以在Windows服务器下请求一台远程Linux服务器下的MySQL实例。

在Windows 2000、Windows XP、Windows 2003和Windows Vista以及在此之后的Windows操作系统中,如果两个需要通

信的进程在同一台服务器上,那么可以使用命名管道,SQL Server数据库默认安装后的本地连接也使用命名管道。在MySQL数据库中,

需在配置文件中启用--enable-named-pipe选项。在MySQL 4.1之后的版本中,MySQL还提供了共享内存的连接方式,在配置文件中

添加--shared-memory。如果想使用共享内存的方式,在连接时,Mysql客户端还必须使用-protocol=memory选项。

启动时可以通过下面的参数进行设置。

mysqld.exe --enable-named-pipe

mysqld.exe --shared-memory

  

除了在启动时进行参数设置外,也可以通过修改MY.INI文件进行设置。我们来看下源码中选择连接方式的分支函数handle_connecti