2013-04-27 32 views
0

我再次對G-WAN和MySQL的一個小問題。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 ... 

回答

0

當MySQL下去。 G-WAN腳本崩潰和G-WAN

由於您只發布創建與MySQL的持久連接的代碼(而不是以後使用MySQL的代碼),因此無法查看代碼如何管理使G-WAN崩潰。

但它是最有可能的,這是當你試圖使用一個無效的套接字崩潰MySQL的驅動程序庫。

這裏的解決方案顯然是通過類似測試插座(其連接狀態)的有效性:

ioctl(fd,FIONREAD,&bytes_available); 

...你將它傳遞給MySQL客戶端庫之前。

+0

實際上,它只會失敗......它不屬於另一個SQL查詢... – solisoft 2013-04-29 06:56:16

+0

MySQL的連接是G-WAN僅僅FD變量誰也不在乎它的價值 - 直到它被使用。所以,如果它沒有被使用,就像你聲稱的那樣,G-WAN不會受到MySQL斷開連接的影響。 – Gil 2013-05-03 09:36:48

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啓動時腳本再次運行。希望它能幫助別人。

帶或不帶附加代碼