MYSQL的有关问题,执行mysql_real_query时程序崩溃了,找到有关问题不知道如何解决,100分求帮助
MYSQL的问题,执行mysql_real_query时程序崩溃了,找到问题不知道怎么解决,100分求帮助!
我的程序文件名是q.fcgi,C语言写的, 然后用lighttpd启动了3个,3个进程完全一模一样,因为是一个程序嘛
程序启动的时候把数据库里所有数据加载到了内存
每时每刻程序都接收请求并处理,然后我1小时会更新一次内存的数据,就是把数据库新加的数据插入到内存中..
每次定时器启动,如果数据库新加了数据,3个进程前面2个进程执行下面代码会没问题,但第3个进程就会崩溃...
Mysql语句就算执行出错也不会程序崩溃的,我这里估计是执行语句的时候操作内存非法了导致崩溃,有时候2个进程会执行崩溃,但第3个进程很大可能会挂
------解决方案--------------------
int len =strlen(sql);
好像要+1的说,这个不算\0的
------解决方案--------------------
我的程序文件名是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); }
------解决方案--------------------
用法上面我觉得没什么大问题,关键是细节要看看,如果有返回值的话,多判下总没什么大错误
------解决方案--------------------
------解决方案--------------------
这个有可能是你使用的MYSQL的头文件与链接的 libmysql.lib 版本不一致导致的,
头文件用的新的版本,而lib,dll用了旧的版本, 你可以去MYSQL上下载一个最新的开发版本,将头文件,lib,dll全换成统一的版本,再试试看.
我原来也碰到过类似的莫名其妙的问题, 后面才发现是头文件与lib版本不一致导致的.