G-WAN和持久MySQL连接
再问我一个关于G-WAN和MySQL的小问题 下面的脚本运行良好。。。 我唯一的问题是MySQL何时崩溃。G-WAN脚本崩溃,G-WAN也崩溃 保持MySQL持久连接和处理MySQL宕机的嵌套方式是什么G-WAN和持久MySQL连接,mysql,g-wan,Mysql,G Wan,再问我一个关于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_
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 ...
typedef结构{
MYSQL*康涅狄格州;
}数据;
int main(int argc,char*argv[])
{
u64 start=getus();
数据**数据=(数据**)获取环境(argv,美国服务器数据);
xbuf_t*reply=get_reply(argv);
if(!data[0])//第一次:永久指针未初始化
{
数据[0]=(数据t*)calloc(1,sizeof(数据t));
如果(!数据[0])
返回500;//内存不足
数据[0]->conn=(MYSQL*)MYSQL_init(数据[0]->conn);
如果(!数据[0]->conn){
xbuf_xcat(回复“MySQL错误”);
返回(200);
}
如果(!mysql\u real\u connect(数据[0]>conn,“localhost”,“root”,“willow”,“test”,NULL,NULL,0)){
返回500;
}
xbuf_cat(回复,“初始化数据
”;
}
//做我们想做的。。。
当MySQL崩溃时,G-WAN脚本崩溃,G-WAN也崩溃
由于您只发布创建到MySQL的持久连接的代码(而不是稍后使用MySQL的代码),因此无法看到您的代码如何使G-WAN崩溃
但是,当您试图使用无效套接字时,很可能是MySQL驱动程序库崩溃了
这里的解决方案显然是通过以下方式测试套接字(其连接状态)的有效性:
ioctl(fd,FIONREAD,&bytes_available);
…在您将其传递到MySQL客户端库之前。如果您在提出问题之前进行一些研究,那就太好了
请参见->此处我的工作脚本:
#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;
}
#pragma链接/usr/lib64/mysql/libmysqlclient.so”
#pragma include“/usr/include/mysql”
#包括
#包括
#包括“gwan.h”//G-WAN导出功能
//静态MYSQL*conn=NULL;
类型定义结构{
MYSQL*康涅狄格州;
}数据;
int main(int argc,char*argv[])
{
u64 start=getus();
数据**数据=(数据**)获取环境(argv,美国服务器数据);
xbuf_t*reply=get_reply(argv);
我的布尔我的真=真;
if(!data[0])//第一次:永久指针未初始化
{
数据[0]=(数据t*)calloc(1,sizeof(数据t));
如果(!数据[0])
返回500;//内存不足
数据[0]->conn=(MYSQL*)MYSQL_init(数据[0]->conn);
mysql_选项(数据[0]->conn、mysql_OPT_RECONNECT和my_true);
如果(!数据[0]->conn){
xbuf_xcat(回复“MySQL错误”);
返回(200);
}
如果(!mysql\u real\u connect(数据[0]>conn,“localhost”,“root”,“willow”,“test”,0,NULL,0)){
返回500;
}
xbuf_cat(回复,“初始化数据
”;
}
if(mysql_ping(data[0]->conn)>0)返回500;//防止G-WAN崩溃
mysql_查询(数据[0]->conn,“从示例中删除”);
对于(int i=1;i<10;i++){
charsql[1024];
s_snprintf(sql,1023,“插入示例(id、姓名、年龄)值(%d,'Olivier',33)”,i);
mysql_查询(数据[0]->conn,sql);
}
整数计数=0;
//查询数据库
mysql_查询(数据[0]->conn,“从示例中选择id、名称、年龄”);
MYSQL\u RES*result=MYSQL\u store\u result(数据[0]->conn);
MYSQL_行*行;
而((row=mysql\u fetch\u row(result)){
计数++;
xbuf_xcat(回复:“:%s:%s:%s”,第[0]行、第[1]行、第[2]行);
xbuf_xcat(答复,
);
}
mysql_免费_结果(result);
xbuf_xcat(回复,
%llUmicro秒数:%d
,(getus()-start),mysql_字段计数(数据[0]->conn));
xbuf_xcat(回复,“MySQL客户端版本:%d”,MySQL_get_客户端版本());
返回200;
}
因此,现在即使mysql关闭,G-WAN仍处于活动状态,当mysql启动时,脚本也能再次工作。希望它能帮助其他人。实际上,无论是否有附加代码,它都会失败……它不属于另一个sql查询……mysql连接只是G-WAN中的一个fd变量,不关心它的值——直到它被删除为止所以,如果它没有被使用,正如您所断言的,G-WAN根本不可能受到MySQL断开连接的影响。