mysql client my_net_write分析——陈良允

来源:互联网 发布:java自带的md5加密 编辑:程序博客网 时间:2024/05/29 10:20

 my_net_write是mysql客户端向服务端写mysql包时候用到的函数,大致流程如下:

...忽略N行....

 while (len >= MAX_PACKET_LENGTH)//len代表要写出的包长,MAX_PACKET_LENGTH=16M,其中16M代表一个mysql数据包最大长度。这里表示如果包超过mysql包最大长//度的话,必须对这个包进行分包处理。
  {
    const ulong z_size = MAX_PACKET_LENGTH;
    int3store(buff, z_size);
    buff[3]= (uchar) net->pkt_nr++;//每个包都有一个序号,包括分包也是独立序号,每次都增加,直到新的command清零。
    if (net_write_buff(net, buff, NET_HEADER_SIZE) ||//这里先写头,再写body,为何不一起写出去?mysql对数据包这块做了优////化,不是每次写出都马上刷到缓存区了,客户端自己维护了一个buffer只有如果这个 buffer还有空间,那么mysql可能选择先不写出这个包,等后面的包写人后一起刷出。
        net_write_buff(net, packet, z_size))
    {
      MYSQL_NET_WRITE_DONE(1);
      return 1;
    }
    packet += z_size;
    len-=     z_size;
  }
  /* Write last packet *//对于不分包的包 直接写出
  int3store(buff,len);
  buff[3]= (uchar) net->pkt_nr++;
  if (net_write_buff(net, buff, NET_HEADER_SIZE))
  {
    MYSQL_NET_WRITE_DONE(1);
    return 1;
  }

  rc= test(net_write_buff(net,packet,len));
  MYSQL_NET_WRITE_DONE(rc);
  return rc;


原创粉丝点击