博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql中对每个connection建一个thread
阅读量:4214 次
发布时间:2019-05-26

本文共 2271 字,大约阅读时间需要 7 分钟。

在mysqld_main函数的最后,通过下面的code来建立来自客户端的连接mysqld_socket_acceptor->connection_event_loop();  void connection_event_loop() {    Connection_handler_manager *mgr =        Connection_handler_manager::get_instance();    while (!connection_events_loop_aborted()) {      Channel_info *channel_info = m_listener->listen_for_connection_event();      if (channel_info != NULL) mgr->process_new_connection(channel_info);    }  }上次我们讲过listen_for_connection_event,这里我们看看process_new_connection的实现void Connection_handler_manager::process_new_connection(    Channel_info *channel_info) {  if (connection_events_loop_aborted() || !check_and_incr_conn_count()) {    channel_info->send_error_and_close_channel(ER_CON_COUNT_ERROR, 0, true);    delete channel_info;    return;  }#这里通过add_connection 来添加connection,这里有两种选择,一种是每个connection 对应一个thread,一个是所有connection统一用一个thread,这里以每个connection 对应一个thread 为例,这也是目前默认的选择  if (m_connection_handler->add_connection(channel_info)) {    inc_aborted_connects();    delete channel_info;  }}add_connection的实现如下:bool Per_thread_connection_handler::add_connection(Channel_info *channel_info) {  int error = 0;  my_thread_handle id;  DBUG_ENTER("Per_thread_connection_handler::add_connection");  // Simulate thread creation for test case before we check thread cache  DBUG_EXECUTE_IF("fail_thread_create", error = 1; goto handle_error;);  if (!check_idle_thread_and_enqueue_connection(channel_info))    DBUG_RETURN(false);  /*    There are no idle threads avaliable to take up the new    connection. Create a new thread to handle the connection  */  channel_info->set_prior_thr_create_utime();#通过mysql_thread_create 来创建thread,这里的mysql_thread_create 就是pthread_create的包装,注意这里就新建一个#thread来处理client的connetion,注意这里的回调函数是handle_connection  error =      mysql_thread_create(key_thread_one_connection, &id, &connection_attrib,                          handle_connection, (void *)channel_info);}static void *handle_connection(void *arg) {    for (;;) {    THD *thd = init_new_thd(channel_info);    thd_manager->add_thd(thd);    if (thd_prepare_connection(thd))      handler_manager->inc_aborted_connects();    else {      while (thd_connection_alive(thd)) {#这里的核心就是调用do_command 来处理client发送过来的命令        if (do_command(thd)) break;      }      end_connection(thd);    }  }}

 

转载地址:http://vinmi.baihongyu.com/

你可能感兴趣的文章
MAC下安装多版本JDK和切换几种方式
查看>>
java.util.concurrent详解
查看>>
java事务大总结(一) 先理解数据库的事务以mysql为例
查看>>
java事务大总结(二) 理解JDBC事务的工作机制
查看>>
java事务大总结(三) 理解学习 JTA(Java Transaction API)
查看>>
java事务大总结(四)spring事务相关大总结
查看>>
驴妈妈管理的一点经验总结
查看>>
IOS开发学习的好资料大搜藏
查看>>
SSH的认证终结(无需密码的git操作或者ssh链接无需密码)
查看>>
Jetty 的工作原理以及与 Tomcat 的比较
查看>>
ssh-keygen的使用方法 注意权限问题
查看>>
zookeeper的server的集群配置实例[张振华-Jack]
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第一篇:互联网时代U盘化生存方式 【张振华.Jack】
查看>>
CentOS6.4配置Hadoop-2.6.0集群配置安装指南(经过实战演练)【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第二篇:专注的力量 [张振华.Jack]
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第三篇:我的舍与得的2014[张振华.Jack]
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第五篇:不要给自己找任何借口【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第七篇:请留意我们身边的风景 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第八篇:坚持的力量 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第九篇:春节那些事-过年回家不需要理由【张振华.Jack】
查看>>