nodejs中mysql断线重连
之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题。放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误。于是上服务器检查了遍,发现程序仍然在运行,且能正确记录每次的请求,再修改代码跟踪调试,原来是在查询数据库的时候,回调一直没有被执行,程序就挂在那里了。
想了很久也想不明白为神马mysql模块没有执行回调,最后突然想起来去看了下错误日志,才发现有个“No reconnection after connection lost”错误没有被捕捉到,原来是连接丢失了,上github上看了下文档和issues,上面说到连接丢失后不会自动重新连接,会触发error事件。我赶紧给程序添加了断线后自动重连功能,现在已正常运行了10多天。
MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)。
自动重连数据库的代码:
function handleError (err) {
if (err) {
// 如果是连接断开,自动重新连接
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
connect();
} else {
console.error(err.stack || err);
}
}
}
// 连接数据库
function connect () {
db = mysql.createConnection(config);
db.connect(handleError);
db.on('error', handleError);
}
var db;
connect();
网上流传的大多数使用mysql模块的代码,往往忽略了这个问题,一不小心就让一拨又一拨的人往坑里踩了。
有童鞋回复问使用pool又会怎样,于是去看了下mysql模块的源码:目前可在npm中安装到的最新版本为2.0.0-alpha7,使用mysql.createPool()来创建的pool没办法自动处理连接被关闭的问题,但是在github上的版本已经修复了(应该还没发布到npm上),当触发了connection的error事件时,会把该connection对象从连接池中移除。(源码:https://github.com/felixge/node-mysql/blob/master/lib/Pool.js#L119 )
使用pool的代码:
var mysql = require('mysql');
var pool = mysql.createPool(config);
pool.getConnection(function(err, connection) {
// Use the connection
connection.query( 'SELECT something FROM sometable', function(err, rows) {
// And done with the connection.
connection.end();
// Don't use the connection here, it has been returned to the pool.
});
});
参考: 《Nodejs使用mysql》 《No reconnection after connection lost》 《mysql自动断开连接的问题处理方案》 《MySQL数据库连接超时(wait_timeout)问题的处理》
nodejs中mysql断线重连的更多相关文章
- nodejs中mysql用法
nodejs也算是一篇脚本了我们来看nodejs如何使用mysql数据库了有了它们两组合感觉还是非常的不错哦,下面一起来看nodejs中使用mysql数据库的示例,希望能够帮助到各位. <scr ...
- nodejs+mysql 断线重连
var mysql = require('mysql'); var conn; function handleError () { conn = mysql.createConnection({ ho ...
- NodeJS中MySql的增删改查操作
纯粹记录一下最基础写法,几乎没有写什么逻辑,写法也并不是很完善(因为我自己也刚刚摸索出来这么写可以...= =!) 望高手指教 也希望能够帮到比我还新的新手.... //1.insert操作 ...
- 用Nodejs连接MySQL
转载,原地址:http://blog.fens.me/nodejs-mysql-intro/ 前言 MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs ...
- 转】用Nodejs连接MySQL
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...
- 基于TCP通信的客户端断线重连
转载:http://www.cnblogs.com/networkcomms/p/4304362.html 源码下载 在CS程序中,断线重连应该是一个常见的功能. 此处的断线重连主要指的是服务器端因为 ...
- nodejs使用MYSQL连接池,断线重连
两种方式解决1.你可以配置mysql的连接池 var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost' ...
- nodejs中如何使用mysql数据库[node-mysql翻译]
nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...
- Netty(六):Netty中的连接管理(心跳机制和定时断线重连)
何为心跳 顾名思义, 所谓心跳, 即在TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...
随机推荐
- 新手怎么读懂一个中型的Django项目
[前言]中型的项目是比较多的APP,肯会涉及多数据表的操作.如果有人带那就最好了,自己要先了解基本的django框架(MTV ,ORM等)师傅可以给讲解一下框架怎么组织url.py,model.py, ...
- mmu介绍
arm exynos4412平台mmu配置以及的简单创建. 1.mmu的全称是Memory Management Unit(内存管理单元) 2.mmu所在位置.mmu再arm核心.他不是一个外设,他是 ...
- POJ3281:Dining(dinic+拆点)
题目链接:http://poj.org/problem?id=3281 PS:刷够网络流了,先这样吧,之后再刷,慢慢补. 题意:有F种食物,D种饮料,N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一 ...
- 深度分析ORACLE热点块问题
1.热点块的定义 数据库的热点块,从简单了讲,就是极短的时间内对 少量数据块进行了过于频繁的访问.定义看起来总是很简单的,但实际在数据库中,我们要去观察或者确定热点块的问题,却不是那么简单了.要深刻地 ...
- Selenium-Grid2 配置RemoteWebDriver
为什么要使用Selenium Grid ? 分布式运行大规模的Test 能够通过一个中央点,很容易的运行不同OS上的不同browser 最小化对Grid的维护时间,并能充分利用虚拟设备 Seleniu ...
- mysql update 多表 (复制)
定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价 ...
- 一步一步学EF系列四【升级篇 实体与数据库的映射】
之前的三张为基础篇,如果不考虑架构问题,做一般的小程序,以足够用了.基本的增删改查也都有了.但是作为学习显然是不够的.通过之前三章的学习,有没有发现这样写有什么问题,有没有觉得繁琐的?可能有人会说,之 ...
- Foundations of RESTful Architecture
Introduction The Representational State Transfer (REST) architectural style is not a technology you ...
- “凯易迅Calix”实习上机——打折问题
题目要求: 题目记得不太清楚,大概的意思是一个商店的打折方案如下:设一个客户买了n个商品,价格分别是p1,p2,...,pn (1)第一个商品不打折,即cost=p1; (2)第i个商品的折扣d=mi ...
- zookeeper 监听事件 CuratorWatcher
zookeeper 监听事件 CuratorWatcher CuratorWatcher一次注册只监听一次,不监听查询. 1.监听测试类 package com.qy.learn.zk.curator ...