【问题标题】:G-WAN and persistent MySQL connexionG-WAN 和持久 MySQL 连接
【发布时间】:2013-04-27 08:15:02
【问题描述】:

我又问了一个关于 G-WAN 和 MySQL 的小问题。

下面的这个脚本工作正常... 我唯一的问题是 MySQL 出现故障时。 G-WAN 脚本崩溃和 G-WAN 也是如此。

保持持久 MySQL 连接和处理 MySQL 停机时间的嵌套方法是什么?

typedef struct { 
   MYSQL *conn;
} data_t;

int main(int argc, char *argv[])
{
  u64 start = getus();
  data_t **data = (data_t**)get_env(argv, US_SERVER_DATA);
  xbuf_t *reply = get_reply(argv);

  if(!data[0]) // first time: persistent pointer is uninitialized
  {
    data[0] = (data_t*)calloc(1, sizeof(data_t));
    if(!data[0])
        return 500; // out of memory
    data[0]->conn = (MYSQL *)mysql_init(data[0]->conn);

    if(! data[0]->conn) {
      xbuf_xcat(reply, "MySQL Error");
      return(200);
    }

    if(! mysql_real_connect(data[0]->conn, "localhost", "root", "willow", "test", NULL, NULL, 0)) {
      return 500;
    }
    xbuf_cat(reply, "initialized data<br>");
  }

  // Do what we want here ...

【问题讨论】:

    标签: mysql g-wan


    【解决方案1】:

    这是我的工作脚本:

    #pragma link "/usr/lib64/mysql/libmysqlclient.so"
    #pragma include "/usr/include/mysql"
    
    #include <mysql.h>
    #include <string.h>
    #include "gwan.h" // G-WAN exported functions
    
    //static MYSQL *conn = NULL;
    
    typedef struct { 
       MYSQL *conn;
    } data_t;
    
    int main(int argc, char *argv[])
    {
      u64 start = getus();
      data_t **data = (data_t**)get_env(argv, US_SERVER_DATA);
      xbuf_t *reply = get_reply(argv);
      my_bool  my_true = true;
    
      if(!data[0]) // first time: persistent pointer is uninitialized
      {
        data[0] = (data_t*)calloc(1, sizeof(data_t));
        if(!data[0])
            return 500; // out of memory
        data[0]->conn = (MYSQL *)mysql_init(data[0]->conn);
        mysql_options(data[0]->conn, MYSQL_OPT_RECONNECT, &my_true);
        if(! data[0]->conn) {
          xbuf_xcat(reply, "MySQL Error");
          return(200);
        }
    
        if(! mysql_real_connect(data[0]->conn, "localhost", "root", "willow", "test", 0, NULL, 0)) {
          return 500;
        }
        xbuf_cat(reply, "initialized data<br>");
      }
    
      if(mysql_ping(data[0]->conn) > 0) return 500; // Prevent G-WAN to crash
    
      mysql_query(data[0]->conn, "DELETE FROM example");
    
      for(int i =1; i< 10; i++) {
        char sql[1024];
        s_snprintf(sql, 1023, "INSERT INTO example (id, name, age) VALUES(%d, 'Olivier', 33)", i);
        mysql_query(data[0]->conn, sql);
      }
    
      int count = 0;
      // Query Database
      mysql_query(data[0]->conn, "SELECT id, name, age FROM example");
      MYSQL_RES *result = mysql_store_result(data[0]->conn);
      MYSQL_ROW *row;
      while ((row = mysql_fetch_row(result))) { 
        count++;
        xbuf_xcat(reply, ": %s : %s : %s", row[0], row[1], row[2]); 
        xbuf_xcat(reply, "<br/>");
      }
      mysql_free_result(result);
    
      xbuf_xcat(reply, "<br>%llUmicro seconds : %d<br/>", (getus()-start), mysql_field_count(data[0]->conn));
      xbuf_xcat(reply, "MySQL Client Version: %d", mysql_get_client_version());
    
    
      return 200;
    }
    

    所以现在即使 mysql 关闭,G-WAN 仍然存在,并且当 mysql 启动时脚本再次工作。希望它会帮助别人。

    【讨论】:

      【解决方案2】:

      如果您在提出问题之前先做一些研究,那就太好了……

      见->http://dev.mysql.com/doc/refman/5.5/en/mysql-ping.html

      【讨论】:

        【解决方案3】:

        当 MySQL 出现故障时。 G-WAN 脚本崩溃和 G-WAN 也是如此

        由于您只发布了创建与 MySQL 的持久连接的代码(而不是稍后使用 MySQL 的代码),因此无法查看您的代码如何设法使 G-WAN 崩溃。

        但很可能这是 MySQL 驱动程序库在您尝试使用无效套接字时崩溃。

        这里的解决方案显然是通过以下方式测试套接字的有效性(其连接状态):

        ioctl(fd,FIONREAD,&bytes_available);
        

        ...在将其传递给 MySQL 客户端库之前。

        【讨论】:

        • 其实不管有没有额外的代码,都会简单的失败...不属于其他sql查询...
        • MySQL 连接只是 G-WAN 中的一个 fd 变量,在使用它之前,它不会关心它的价值。因此,如果不使用它,正如您断言的那样,G-WAN 就不会受到 MySQL 断开连接的影响。
        猜你喜欢
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 2010-11-10
        • 2013-06-05
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多