我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql中Connection Manager的作用是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql中Connection Manager的作用是什么

这篇文章给大家介绍Mysql中Connection Manager的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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); 

#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_connections_methods:

handle_connections_methods()

{

if (hPipe != INVALID_HANDLE_VALUE)

{

       handler_count++;

       if (pthread_create(&hThread,&connection_attrib,

               handle_connections_namedpipes, 0))

       {

      sql_print_warning("Can't create thread to handle named pipes");

      handler_count--;

    }

}

    if (have_tcpip && !opt_disable_networking)

  {

    handler_count++;

    if (pthread_create(&hThread,&connection_attrib,

               handle_connections_sockets, 0))

    {

      sql_print_warning("Can't create thread to handle TCP/IP");

      handler_count--;

    }

  }

if (opt_enable_shared_memory)

  {

    handler_count++;

    if (pthread_create(&hThread,&connection_attrib,

               handle_connections_shared_memory, 0))

    {

      sql_print_warning("Can't create thread to handle shared memory");

      handler_count--;

    }

  }

}

由于对于namepipe和memory share的通信方式不太了解,这里只研究socket的通信方式。从代码中可以看出,handle_connections_sockets便是socket的设置,我们就来看下它。

4.socket管理创建新线程socket管理其实比较简单,直接给出其伪代码:

handle_connections_sockets

{

    select; //监视socket文件描述符

    new_socket = accept;//处理到来的客户端连接

    thd = new THD;创建THD类

    vio_tmp = vio_new(new_socket,VIO_TYPE_TCPIP, 0);   //初始化VIO结构体

    my_net_init(&thd->net, vio_tmp);//初始化thd的net结构体

    create_new_thread(thd);//为这个连接创建一个新的线程,如果是单线程模式的话,就不会创建一个新线程

}

首先是select函数进行监视socket端口,如果监控到有连接,则通过accept函数接受客户端的连接,然后新建一个THD类,将连接参数全部设置到THD类的参数上,最后调用create_new_thread函数,这个函数便是重点。 我们进入这个函数,看下做了啥。

create_new_thread

{

    ++connection_count;//全局连接数自增

    thread_count++;    //全局线程数自增

    thread_scheduler.add_connection(thd);//真正创建线程

}

     So easy,首先将全局连接数+1,全局线程数+1,然后调用add_connection函数,这个函数就是我们在上面第一步设置连接的

线程数中,one_thread_scheduler和one_thread_per_connection_scheduler中设置的一个参数。这两者的区别便是是否创建了

一个新的线程来处理到来的连接。one_thread_scheduler是单线程方式,木有新建线程。我们重点研究one_thread_per_connection_scheduler,其设置的add_connection函数为create_thread_to_handle_connection:

create_thread_to_handle_connection(THD *thd)

{

    thread_created++;

    threads.append(thd); // 创建线程数自增,并加入到threads链表上

    pthread_create(&thd->real_id,&connection_attrib,

                              handle_one_connection,

                              (void*) thd);//这就是真正创建线程的地方了,函数便是handle_one_connection

}

    可见,最后调用了pthread_create函数,这个函数便是创建一个新的线程,新线程的处理函数为handle_one_connection.

5.新线程处理流程

     新线程处理函数为handle_one_connection,到此位置,一个新的connection被一个新创建的线程所单独处理。我们看下其中

是如何进行处理的。

handle_one_connection(void *arg)

{

    for (;;)

    {

        lex_start(thd); //初始化词法分析结构体

        login_connection(thd); //用户认证,失败报错

        prepare_new_connection_state(THD* thd);//Initialize THD to handle queries

         while (!net->error && net->vio != 0 &&   //循环处理command

           !(thd->killed == THD::KILL_CONNECTION))

        {

            if (do_command(thd))

              break;                   //处理失败跳出

          }

          end_connection(thd);         //关闭连接

          close_connection(thd, 0, 1);

         thread_scheduler.end_thread(thd,1);//结束线程

                  return 0;

    }

}

    首先进行了词法分析结构体的初始化,然后进行用户认证,认证成功后通过do_command循环执行客户端发过来的命令。

6.总结

     整个connection manager的流程十分清晰,单线程的连接一般很少使用,大多使用多线程方式。多线程连接中其实还涉及到线程缓冲

池的概念,即如果一个连接断开后,其所创建的线程不会被销毁掉,而是放到缓冲池中,等待下一个新的connection到来时,首先去线程

缓冲池查找是否有空闲的线程,有的话直接使用,木有的话才去创建新的线程来管理这个connection。这些属于Thread Manage的内容,

关于Mysql中Connection Manager的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql中Connection Manager的作用是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ADO.NET中Connection方法的作用是什么

ADO.NET中Connection方法的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.ADO.NET Connection方法使用Open建立与数据源的物理
2023-06-17

C#中Connection对象的作用是什么

本篇文章给大家分享的是有关C#中Connection对象的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,必须使用微软的Access创建一个数据库。运行Acces
2023-06-17

Tomcat中Manager的用法是什么

Tomcat中的Manager是一个组件,用于管理用户会话(sessions)的创建、维护和销毁。Manager在Tomcat中用来处理用户会话的生命周期,包括创建新会话、维护现有会话和销毁过期会话等。Manager提供了一套接口和方法,使
Tomcat中Manager的用法是什么
2024-04-03

redis中connection的用法是什么

在Redis中,连接(Connection)是与Redis服务器建立通信的基本手段。连接的作用是建立客户端与服务器之间的通信通道,以便客户端可以向服务器发送命令并接收服务器的响应。连接可以通过Redis客户端库(如redis-py、php
redis中connection的用法是什么
2024-04-19

mysql中json_search的作用是什么

MySQL中JSON_SEARCH函数JSON_SEARCH函数在JSON文档中搜索指定键的值。它支持两种路径模式:key(仅匹配键)和value(匹配键和值)。通过高级用法如模糊搜索、正则表达式和返回多个结果,它提供了处理复杂JSON数据的强大工具。优点:高效、灵活、可扩展;缺点:语法复杂、可能存在性能开销。
mysql中json_search的作用是什么
2024-04-12

mysql中json_array的作用是什么

MySQLJSON_ARRAY函数JSON_ARRAY()函数将一系列值转换为JSON数组,方便创建、更新或检索JSON数据。语法为JSON_ARRAY(value1,value2,...,valueN),值可以是字符串、数字、布尔值、NULL或JSON对象。它可用于:创建JSON数组将现有值转换为JSON数组更新JSON数组检索JSON数组元素JSON_ARRAY()函数简单易用,可高效处理大型数据集,提高JSON数据灵活性,适用于存储多个值、提取JSON数组、修改数组元素以及与外部JSON数据源交互的
mysql中json_array的作用是什么
2024-04-10

mysql中MVCC的作用是什么

本篇文章为大家展示了mysql中MVCC的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明多版并发控制MVCC是MySQL InnoDB存储引擎实现隔离等级的具体方法,用于实现提交阅
2023-06-15

MySQL中Like的作用是什么

MySQL中Like的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Like是什么意思?1、Like算作MySQL中的谓词,其应用与is、=、>和
2023-06-14

mysql中benchmark的作用是什么

在MySQL中,BENCHMARK() 函数用于执行一个表达式多次以进行性能测试。该函数可以指定要执行的测试次数以及要重复执行的表达式。它的语法如下:BENCHMARK(count, expr)其中 count 是要执行的次数,expr
mysql中benchmark的作用是什么
2024-04-23

mysql中tostring的作用是什么

在MySQL中,没有名为toString的函数。如果您想将一个值转换为字符串,可以使用内置的CAST()函数或CONVERT()函数。这两个函数可以将不同的数据类型转换为字符串类型。例如,您可以将一个整数转换为字符串或将一个日期转换为字符串
mysql中tostring的作用是什么
2024-04-23

mysql中profile的作用是什么

在MySQL中,PROFILE是一个用于分析查询语句性能的工具。通过使用PROFILE,可以查看查询语句的执行计划、扫描行数、扫描时间等信息,帮助用户优化查询语句,提高查询性能。PROFILE可以显示查询语句执行时的各种统计信息,包括查询时
mysql中profile的作用是什么
2024-03-14

mysql中socket的作用是什么

在MySQL中,socket是一种用于连接数据库的通信协议。当客户端程序连接到MySQL服务器时,它们通过socket进行通信。Socket是一种在网络上进行数据传输的通用技朶,它允许客户端和服务器之间进行双向通信,并且可以保持连接状态。在
mysql中socket的作用是什么
2024-03-15

mysql中countif的作用是什么

在MySQL中,没有内置的COUNTIF函数。但是,可以使用SELECT语句结合SUM和CASE语句来实现类似COUNTIF的功能,例如:SELECT SUM(CASE WHEN condition THEN 1 ELSE 0 END)
mysql中countif的作用是什么
2024-04-09

mysql中nextval的作用是什么

在MySQL中,没有内置的nextval函数,这是因为MySQL没有像Oracle或PostgreSQL这样的序列对象。在MySQL中,可以使用AUTO_INCREMENT关键字来为表的某一列设置自增长的功能,以便在插入新记录时自动生成唯一
mysql中nextval的作用是什么
2024-04-09

编程热搜

目录