栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言接口】长时间不使用mysql连接后mysql

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言接口】长时间不使用mysql连接后mysql

问题表现

前一天对数据库进行插入、查询、更新都没有问题,第二天使用的的时候一旦触发mysql_query()就会造成插入失败甚至段错误。

由于项目实际需要,连接数据库后,没有mysql_close()。

经过百度一波后,查询到的内容为,当一个连接连接到服务器后,如果在wait_time时间内不进行任何交互后,服务器就会断开连接,这种情况的直观表现是:超时后,第一次对数据库进行操作,会返回2006:Server has gone way的错误码。

如何查询wait_time时间?

进入到数据库后
设置时间:
set global wait_timeout=60;(非交互的时间)
set global interactive_timeout=60;(交互的时间)

查看时间:
show global variables like'wait_timeout';
show global variables like 'interactive_timeout';

查看连接数:
show status like 'Threads%';

项目中使用的mysql的版本是:5.1.72

对于这种问题,网上说法是使用mysql_query之前使用mysql_ping接口,此接口会检查该连接是否正常,但只使用mysql_ping是不会进行自动重连的,要跟着mysql_option()添加MYSQL_OPT_RECNNECT属性一起使用才能达到效果。

复现效果和测试demo

想要复现效果,就要改动两个时间,一个是wait_timeout的时间,一个是interactive_timeout的时间,如果根据上述修改方式进行修改,在重启mysql后还是需要重新修改的,想要永久的修改就只能修改配置文件my.cnf(windows: my.ini)。

#include 
#include 
#include 
int main()
{
    MYSQL *mysql = mysql_init(NULL);
    char value = 1;
    mysql_options(mysql,MYSQL_OPT_RECONNECT,(char *)&value);
    if(NULL ==mysql_real_connect(mysql,
                                 "hostIP",
                                 "username",
                                 "password",
                                 "database",
                                 port,
                                 NULL,0))
    {
        printf("%sn",mysql_error(mysql));
        return 0;
    }
    int ret = mysql_ping(mysql);
    if(mysql_query(mysql,"insert_sql"))
    {
        printf("err1:%d:%sn",mysql_errno(mysql),mysql_error(mysql));
    }
    else printf("ok~n");
    printf("ret = %dn",ret);
    int block_num;
    scanf("%d",&block_num);         //触发定时
    sleep(60*2);                    //wait_timeout时间
    printf("sleep is overn");
    ret = mysql_ping(mysql);
    if(mysql_query(mysql,"insert_sql"))
    {
        printf("err2:%d:%sn",mysql_errno(mysql),mysql_error(mysql));
    }
    else printf("ok~~n");
    printf("ret = %dn",ret);        
    
    return 0;
}

传送门:【MySQL :: MySQL 5.6 C API 开发者指南 :: 5.4.49 mysql_options()】

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690328.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号