c中mysql自动重新连接(部分zz)-axejonny-chinaunix博客


本站和网页 http://blog.chinaunix.net/uid-18989614-id-2798646.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

C中MySQL自动重新连接(部分zz)-axejonny-ChinaUnix博客
Chinaunix首页 | 论坛 博客 博文 博主 强尼
Just_for_fun.
-->
4月28日14:30-20:30机房服务器迁移,暂停博客使用
9/30日 14:00 -10/4日 08:00暂时无法发布内容!
首页
 |  
博文目录
关于我
axejonny
博客访问: 226437
博文数量: 66
博客积分: 2510
专家积分: 180
博客等级: 少校
技术积分: 700
组:
普通用户
注册时间: 2009-07-27 22:10
个人简介
闲时会写写程序的非技术人员。
文章分类
全部博文
(66)
量化交易
(5)
Python
(4)
系统
(1)
Linux开发配置
(22)
MySQL
VIM
(2)
Apache
Bash
Debian系服务配置
(0)
Red Hat系服务配
(3)
嵌入式
broadcom板
mips
其他
MACOS
ORACLE
C/C++
Makefile
(6)
开源-Apache模块
开源-ICE
编程风格
Tool
LANG
(7)
多媒体技术
内核
驱动
内核编程
内核编译
未分配的博文
文章存档
2022年
2022年01月
2018年
(11)
2018年11月
2018年09月
2018年05月
2018年04月
2018年03月
2018年01月
2011年
2011年01月
2010年
(36)
2010年08月
(8)
2010年07月
(25)
2010年02月
2009年
(17)
2009年11月
2009年10月
2009年09月
2009年08月
2009年07月
我的朋友
最近访客
km康蒙92
格伯纳
gaokeke1
王楠w_n
csk0411
panda818
hailun19
rollin7
风际的云
订阅
推荐博文
Canal - MySQL实时数据采集工...
ORACLE NOT IN:NULL AWARE AN...
OpenHarmony中SELinux使用详...
将OR子查询改写为JOIN等值查...
如何判断一个数仓模型的好坏...
热词专题
相关博文
Oracle 12CR2 RAC部署翻车,b...
亚信安慧AntDB:数据浪潮领航...
亚信安慧AntDB:打造优质数据...
亚信安慧AntDB:数据库利器...
原生分布式数据库在杭州银行...
实时数仓架构解析,深入了解...
分析型数据库系统的主要应用...
数仓分层详解,数仓分层原理...
数仓建模的方式有哪些,比较...
分析型数据库和关系型数据库...
C中MySQL自动重新连接(部分zz)
分类:
Mysql/postgreSQL
2010-08-04 16:09:06
MySQL服务器每隔一段时间会关闭连接,需要重新连一下,方法是调用mysql_ping。
我的代码:
MYSQL *conn;  
MYSQL_RES *result;
MYSQL_ROW row;
int num_fields;
int i;
//for reconnect 
#if MYSQL_VERSION_ID >= 50013
my_bool           reconnect;//my_bool = char
#endif
conn = mysql_init(NULL);
reconnect = 1;
//set re-conn to true. could use ping to reconn
if (mysql_options(conn, MYSQL_OPT_RECONNECT, &reconnect) != 0) {
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
if (conn == NULL) {
//printf("%s\n",__LINE__);
if (mysql_real_connect(conn, "localhost", "root", "", "online_stat", 0, NULL, 0) == NULL) {
/* mysql_query(conn, "SELECT * FROM daily_online_stat");
  result = mysql_store_result(conn);
  num_fields = mysql_num_fields(result);
  while ((row = mysql_fetch_row(result)))
  {
  for(i = 0; i
  printf("%s ", row[i] ? row[i] : "NULL");
  }
  printf("\n");
*/
char strSql[1000];
bzero(strDate, 20);
bzero(strSql, 1000);
//TODO:TEST
getDate(strDate);
printf("%s", strDate);
strPeak = "999";
strWebId = "Adios";
strTotalLogin = "12345";
sprintf(strSql, "insert into daily_online_stat values ('NULL', '%s', '%s', '%s', '%s');", strDate, strPeak.c_str(), strTotalLogin.c_str(), strWebId.c_str());
printf("%s\n", strSql);
mysql_query(conn, strSql);
//mysql_free_result(result);
mysql_close(conn);
以下摘自:http://blog.chinaunix.net/u1/50685/showart_1805135.html
1) 增大/etc/my.cnf中wait_timeout的值,比如设置wait_timeout=8640000,即100天。这个值缺省是8小时。这个方法简单,但是不能彻底解决问题。推荐第二种解决方法。
2)使用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进行判断,如果连接已经断开,会自动重连。
不过,请注意,自动重新连接也会导致一些副作用,如下:
    * 任何活动的交易都被回滚,autocommit模式被置为reset。
    * 所有表锁都释放
    * 所有临时表是关闭(撤消)
   
* Session variables are reinitialized to the values of the
corresponding variables.会话变量被重新初始化为相应的变量。 这也影响那些隐式声明的变量,SET
NAMES。比如使用This also affects variables that are set implicitly by
statements such as SET NAMES.这也影响了变量,是一套由含蓄的声明,例如订定的名称。
    * 用户变量设置都将丢失。
    * 编制报表释放。
    * 句柄变量被关闭。
    * LAST_INSERT_ID()被重置为0 。
    * 使用GET_LOCK()获得的锁被释放
首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。
  一个好的解决方法是使用mysql_ping。在使用mysql_real_connect连接数据库之后,再使用mysql_options(
&mysql, MYSQL_OPT_RECONNECT, … )
来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库。如果是在mysql
5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options( &mysql,
MYSQL_OPT_RECONNECT, … ) ,如果是mysql 5.1.6+,则在connect之前执行一次就够了。
  有一种很自然的想法就是,新开一个线程,让它隔一定时间(如20秒)就执行一次mysql_ping.除此而外它什么都不用做。但是显然,这个线程必须与其它线程共享一个mysql连接,共享该mysql句柄。否则这样做一点意义都没有。
  但是,mysql_ping会改变mysql_affected_rows的返回值。所以最好是给该MYSQL句柄再加一个mutex(最好是读写
锁)。当其它线程准备执行query的时候,就获取锁,执行完就释放。而这个执行mysql_ping的线程在执行ping之间先尝试获取锁,如果获取失
败,则继续sleep,放弃这一轮的ping。
管理员在2009年8月13日编辑了该文章文章。
阅读(3160) | 评论(0) | 转发(0) |
上一篇:
C中Mysql选项(zz)
下一篇:
mysql_store_result()与mysql_use_result()的比较(zz)
热门推荐
给主人留下些什么吧!~~
评论热议
请登录后评论。
登录
注册
关于我们
关于IT168
联系方式
广告合作
法律声明
免费注册
Copyright
2001-2010 ChinaUnix.net All Rights Reserved 北京皓辰网域网络信息技术有限公司. 版权所有
感谢所有关心和支持过ChinaUnix的朋友们
16024965号-6