mysql的C++代码设计遇到的坑(持续更新9/28)

mysql连接问题:

①简述:Mysql网络断开重连问题,需要结合mysql_options的函数和mysql_ping函数

错误原因:断开网络后重新将mysql连接释放(mysql_close(MYSQL )),并重新初始化mysql_init((MYSQL )),然后再用mysql_real_conncet()函数进行连接,但是这样做的后果是mysql_real_connect()报错,报错内容为没有足够的内存,
————————————————
版权声明:本文为CSDN博主「fantasydreams」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fantasydreams/article/details/45459653

②问题:设置mysql自动重连问题,缺省值为8小时不用就会关闭连接

措施:

法一:增大/etc/my.cnf中wait_timeout的值,比如设置wait_timeout=8640000,即100天。这个值缺省是8小时。这个方法简单,但是不能彻底解决问题。推荐第二种解决方法。

法二:使用mysql_ping来自动检查重连。用到两个函数,一个是mysql_ping,另外一个是mysql_options。具体使用方法是在mysql_real_connect之前,mysql_init之后,使用mysql_options。用法如下

char value = 1;
 (void) mysql_init (&mysql);
 mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&value);
然后在以后mysql_query之前首先使用mysql_ping进行判断,如果连接已经断开,会自动重连。 

链接:https://www.cnblogs.com/devcjq/articles/6082221.html

③生产环境中可能不会用到以上的方案,

  • 原因:因为mysql_ping如果发现连接断开,自动重连的时候,所有锁会释放,不会自动再加上锁,但是重新mysql_real_connect的时候,会自动加上锁,所以一般都会只用mysql_real_connect避免一些其他的问题出现

④mysql批量插入数据量过大报错解决办法

  • 报错简述

Packet for query is too large (6071393 > 4194304). You can change this value on the server by setting the max_allowed_packet’ variable.

  • 解决方法

修改 my.ini 加上 max_allowed_packet =67108864
(备注:67108864=64M,默认大小4194304 也就是4M,修改完成之后要重启mysql服务,如果通过命令行修改就不用重启mysql服务。)

设置为500M
mysql> set global max_allowed_packet = 500*1024*1024; 

或者
mysql> set global max_allowed_packet = 524288000;

    登陆mysql,运行

     show VARIABLES like '%max_allowed_packet%';

⑤mysql escape 函数_mysql_real_escape_string()函数的作用:防止SQL注入的方法

  • 解释:

①该函数用于创建可在SQL语句中使用的合法SQL字符串。请参见9.1.1节,“字符串”。
②按照连接的当前字符集,将“from”中的字符串编码为转义SQL字符串。将结果置于“to”中,并添加1个终结用NULL字节。编码的字符为NUL (ASCII 0)、‘\n’、‘\r’、‘\’、‘’’、‘"’、以及Control-Z(请参见9.1节,“文字值”)。(严格地讲,MySQL仅需要反斜杠和引号字符,用于引用转义查询中的字符串。该函数能引用其他字符,从而使得它们在日志文件中具有更好的可读性)。
③“from”指向的字符串必须是长度字节“long”。必须为“to”缓冲区分配至少length*2+1字节。在最坏的情况下,每个字符或许需要使用2个字节进行编码,而且还需要终结Null字节。当mysql_real_escape_string()返回时,“to”的内容是由Null终结的字符串。返回值是编码字符串的长度,不包括终结用Null字符。
④如果需要更改连接的字符集,应使用mysql_set_character_set()函数,而不是执行SET NAMES (或SET CHARACTER SET)语句。mysql_set_character_set()的工作方式类似于SET NAMES,但它还能影响mysql_real_escape_string()所使用的字符集,而SET NAMES则不能。

  • 代码
char query[1000],*end;
 
end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';
 
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
   fprintf(stderr, "Failed to insert row, Error: %s\n",
           mysql_error(&mysql));
}

补充说明:该示例中使用的strmov()函数包含在mysqlclient库中,工作方式与strcpy()类似,但会返回指向第1个参数终结用Null的指针。

  • 返回值

返回置于“to”中的值的长度,不包括终结用Null字符。

  • 可能产生的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值