mysql 长连接断开问题
从MySQL 5.0.3开始,默认情况下禁止再连接,这是5.0.13中的新选项,提供了一种以显式方式设置再连接行为的方法。
mysql应用程序建立的长连接,大约过8小时会断开【没测过,网上都是这么说的】,这个与mysql的参数wait_timeout有关。可以用
show variables like '%time%';
语句查看下。
解决方法:
1. 修改配置文件:
/etc/my.cnf中wait_timeout的值,比如设置wait_timeout=8640000,即100天
2. mysql语句操作:set iwait_timeout=86400000
// 设定连接的生命周期1年
mysql_query(mysql_connection, "set wait_timeout=31536000");
1> interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。
说得直白一点,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
2> 在连接启动的时候,根据连接的类型,来确认会话变量wait_timeout的值是继承于全局变量wait_timeout,还是interactive_timeout。
3. mysql的API函数:
mysql_options与mysql_ping函数搭配使用,
在建立连接mysql_real_connect函数调用成功后,设置mysql的重连选项,
// 设置自动重连
char value = 1; // 0 禁止重连 1 启动重连
mysql_options(mysql_connection, MYSQL_OPT_RECONNECT, &value);
再建立一个线程,固定频率调用mysql_ping函数,注意问题--------
mysql_ping会改变mysql_affected_rows的返回值。所以最好是给该MYSQL句柄再加一个mutex(最好是读写锁)。当其它线程准备执行query的时候,就获取锁,执行完就释放。而这个执行mysql_ping的线程在执行ping之间先尝试获取锁,如果获取失败,则继续sleep,放弃这一轮的ping。
不过网上有人说,如果设置了MYSQL_OPT_RECONNECT(),那么mysql_query()是可以完成自动重连的。
最新文章
- Windows下安装pip(转自http://www.cnblogs.com/yuanzm/p/4089856.html)
- 小游戏Talk表
- HDFS源码分析:NameNode相关的数据结构
- 常用开源镜像站整理android sdk manager
- FlashInspector 【Firefox浏览器插件,flash分析工具】
- Linux 学习笔记 cp 和 ln
- java List交集 并集 差集 去重复并集
- Android的GridView和Gallery结合Demo
- a标签的 target 使用
- lca转RMQ
- C#中的委托(一)
- PHP如何强制下载文件
- Python基础_函数闭包、调用、递归
- jquery datatables+MVC+WCF
- Python学习笔记【第十二篇】:Python异常处理
- arduino json 解析
- Mac 无需网线创建ipv6环境
- Django的URL name 学习
- 最短路径-Floyd算法(转载)
- LUOGU P4408 [NOI2003]逃学的小孩(树的直径)
热门文章
- DedeCms织梦后台管理员密码修改和忘记重置方法
- 使用Android Studio和Gradle编译NDK项目之Experimental Plugin User Guide
- c++11 实现RAII特性
- AngularJs学习笔记--IE Compatibility 兼容老版本IE
- bootstrap Switch 的一个坑点
- 使用commons-fileupload-1.2.1.jar等组件实现文件上传
- spring集成ehcache本地缓存
- log4j框架logger的继承关系以及使用场景
- Monad新解-FRP对比——ReactiveCocoa、RxSwift、Bacon以及背后的Functional
- BZOJ 3289: Mato的文件管理 【莫队 + 树状数组】