在Node.js使用mysql模块时遇到的坑

摘要:
自动重新连接到数据库的代码:functionhandleError{if{//如果连接中断,则在{connect();}时自动重新连接否则{console.error;}}}//Connect数据库函数Connect(){db=mysql.createConnection;db.Connect;db.on;}瓦德布;connect();互联网上流传的大多数使用MySQL模块的代码往往忽略了这个问题,并无意中让很多人钻了空子。一只童鞋回答说,他问如果他使用游泳池会发生什么。因此,他查看了MySQL模块的源代码:可以在NPM中安装的最新版本是2.0.0-alpha7,它使用MySQL。createPool()创建的池无法自动处理连接关闭的问题,但github上的版本已经修复。当触发连接错误事件时,将从连接池中删除连接对象。

     之前写了个小程序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.
  });
});

  转载:http://cnodejs.org/topic/516b77e86d382773064266df

 

免责声明:文章转载自《在Node.js使用mysql模块时遇到的坑》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于研发规范化的一些实践和思考Android-监听网络状态下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++连接mysql数据库的两种方法

现在正做一个接口,通过不同的连接字符串操作不同的数据库。要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多。通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法。可以通过2种方法实现。 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接。 第一种方法可以实现我当前的需求,通...

(原创)LAMP搭建之一:图解如何安装并检查LAMP

LAMP搭建之一:图解如何安装并检查LAMP 第一步:安装Linux(RedHat5) 第二步:rpm -qa httpd(查看apache是否安装)     rpm -qa php(查看php是否安装)     rpm -qa mysql(查看mysql是否安装)     如果没有安装,用rpm -ivh 安装。 第三步:service httpd sta...

数据库6.高级

1.视图:什么是视图:视图是有一张或多张表的查询结果构成的一张虚拟表create view dept_view as select *from dept;为什么使用视图:使用权限控制 只能开放某一列的数据访问 对于目前的查看工资而言是没有意义的我们使用虎能够查看整条语句1.多次使用时,可以简化书写2.隔离数据,可以修改原表中的数据;但是我们一般不会这么做。总...

解决mySQL占用内存超大问题

为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆。网上搜索了一下,得到高人指点my.ini。再也没见再详细的了..只好打开my.ini逐行的啃,虽然英文差了点,不过多少M还是看得明的^-^ 更改后如下: innodb_buffer_pool_size=576M ->256M InnoDB引擎缓冲区占了大头,首要就是...

centos LNMP第一部分环境搭建 LAMP LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/php/{p.conf.default,p.conf} php运行方式SAPI介绍 第二十三节课

centos  LNMP第一部分环境搭建 LAMP安装先后顺序  LNMP安装先后顺序 php安装 安装nginx  编写nginx启动脚本   懒汉模式  mv   /usr/local/php/{p.conf.default,p.conf}  php运行方式SAPI介绍  第二十三节课 推荐搜狐下载地址:http://mirrors.sohu.com/...

pyspider安装

操作系统 CentOS Linux release 7.0.1406 (Core) Python环境 Python安装   安装依赖:yum install gcc # 安装python必须yum install zlib # 以下四个安装setuptools必须,如果安装在python后,则需要重新make pythonyum install zlib...