首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

MYSQL的有关问题,执行mysql_real_query时程序崩溃了,找到有关问题不知道如何解决,100分求帮助

2012-10-20 
MYSQL的问题,执行mysql_real_query时程序崩溃了,找到问题不知道怎么解决,100分求帮助!我的程序文件名是q.f

MYSQL的问题,执行mysql_real_query时程序崩溃了,找到问题不知道怎么解决,100分求帮助!
我的程序文件名是q.fcgi,C语言写的, 然后用lighttpd启动了3个,3个进程完全一模一样,因为是一个程序嘛
程序启动的时候把数据库里所有数据加载到了内存
每时每刻程序都接收请求并处理,然后我1小时会更新一次内存的数据,就是把数据库新加的数据插入到内存中..

每次定时器启动,如果数据库新加了数据,3个进程前面2个进程执行下面代码会没问题,但第3个进程就会崩溃...
Mysql语句就算执行出错也不会程序崩溃的,我这里估计是执行语句的时候操作内存非法了导致崩溃,有时候2个进程会执行崩溃,但第3个进程很大可能会挂



[解决办法]
int len =strlen(sql);
好像要+1的说,这个不算\0的
[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>#ifdef WIN32#include <winsock2.h>#ifndef WIN32_LEAN_AND_MEAN#define WIN32_LEAN_AND_MEAN#endif#include <windows.h>#include <process.h>#else#include <unistd.h>#include <string.h>#endif#include "mysql5/mysql.h"#pragma comment(lib, "libmysql.lib")int main(void){    MYSQL* mysql_insert = NULL;    MYSQL_RES *result = NULL;    MYSQL_ROW row;    char sql[100] = {0};    int len = 0;    mysql_insert = mysql_init((MYSQL*)NULL);    //初始化数据库    //mysql_init(mysql_insert);    if(mysql_insert==NULL)    {        return -1;    }    //连接数据库    mysql_insert = mysql_real_connect(mysql_insert, "192.168.1.63", "user", "pwd", NULL, 3306, NULL, 0);    if(!mysql_insert) return -1;    //选择数据库表    if(mysql_select_db(mysql_insert, "db") != 0) return -1;    sprintf(sql, "select id, title, artist, lrc from %s where id > %d order by id", "user", 100);    len =strlen(sql);    //设置mysql编码    mysql_query(mysql_insert,"SET NAMES utf8");    printf("ready to query\n");    if(mysql_real_query(mysql_insert, sql, len)!=0) //执行查询sql语句,在此会出错并且程序崩溃    {        printf("last error %s\n", mysql_error(mysql_insert)); //执行不到        return -1;    }    printf("ready to getdata\n");    //读取查询到的信息    if(!(result=mysql_store_result(mysql_insert))) //上面没崩溃,这里也可能崩溃    {        return -1;        }        while(row = mysql_fetch_row(result))    {        //做将数据插入到内存的map表中        }    //释放记录        mysql_free_result(result);    mysql_close(mysql_insert);    mysql_insert = NULL;    return (0);}
[解决办法]
用法上面我觉得没什么大问题,关键是细节要看看,如果有返回值的话,多判下总没什么大错误
[解决办法]
探讨

回 hawk198
我拷贝你的代码看看。
我现在在用信号量来控制,主要是代码本身并没问题
但是在3个进程同时执行这个代码的时候
第1,2个进程基本不出问题,但第3个进程很大可能崩溃!!

[解决办法]
这个有可能是你使用的MYSQL的头文件与链接的 libmysql.lib 版本不一致导致的, 

头文件用的新的版本,而lib,dll用了旧的版本, 你可以去MYSQL上下载一个最新的开发版本,将头文件,lib,dll全换成统一的版本,再试试看.

我原来也碰到过类似的莫名其妙的问题, 后面才发现是头文件与lib版本不一致导致的.

热点排行