开发者社区> 问答> 正文

C API调MySQL长时间运行会导致连接失败问题?

环境是Windows XP SP3,MySQL 5.1.33,客户端是Bin下的libmysql.dll。
已经打了注册表补丁:

  "TcpTimedWaitDelay"=dword:0000001e
  "MaxUserPort"=dword:0000fffe

.h
MYSQL *mysql;

.cpp
        try
        {
//         MYSQL mysql_struct;
//         mysql = &mysql_struct;
//         mysql_init(mysql);
            mysql = mysql_init(NULL); //时间久了(2小时以上),执行到这里会异常
            if (NULL == mysql)
                ::MessageBox(NULL, _T("出错了!"), _T("TEST MODE"), MB_OK);
            
            if (!mysql_real_connect(mysql,"127.0.0.1", "root", "", "db",3309,NULL,0))                
            {
                CString str;
                str.Format("%d,%s", i,mysql_error(mysql));
                ::MessageBox(NULL, _T(str), _T("TEST MODE"), MB_OK);
                //printf( "Error connecting to database: %s\n",mysql_error(mysql));
            }
            else
                printf("Connected...\n");
//             
// mysql_set_character_set(mysql,"gbk"); 
            _tcscpy(lpszString, _T("call SP_DWXX(330000)"));
            mysql_real_query(mysql, lpszString, _tcslen(lpszString));
            
            mysql_close(mysql);
            mysql=NULL;
            mysql_library_end();//这里也会异常
        }
        catch (...)
        {
            CString str;
            str.Format("catch:%d", i);
            ::MessageBox(NULL, _T(str), _T("TEST MODE"), MB_OK);
        }
    }

展开
收起
蛮大人123 2016-02-05 19:00:02 3015 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    1. 如果你的程序是想共享一个连接的话,那么mysql*只需要初始化一次。没必要每次都初始化。
      在初始化以后,将interactive_timeout 和 wait_timeout都设置大一些。(如1073741824L)
      sql = "set wait_timeout=" + timeout;
      executeCmd(sql.c_str());
      sql = "set interactive_timeout=" + timeout;
      executeCmd(sql.c_str());
    2. 即算是想每次都创建连接的话,你也可预先多创建几个连接,给这些调用使用。
    2019-07-17 18:38:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
CUDA MATH API 立即下载
API PLAYBOOK 立即下载
传统企业的“+互联网”-API服务在京东方的实践 立即下载

相关镜像