节点mysql超时

Posted

技术标签:

【中文标题】节点mysql超时【英文标题】:timeout in node mysql 【发布时间】:2012-12-20 06:59:44 【问题描述】:

我们知道node有一些mysql模块,一些是纯js实现的(如node-mysql),一些是基于c libmysql的。

我更喜欢 node-mysql,因为它不需要额外的 mysql 库,看起来更“干净”。但我也注意到它不支持连接和查询中的超时功能,这可能会在某些环境中导致问题。

所以我的问题是:有人干净地解决了这个超时问题吗?

【问题讨论】:

nodejs mysql Error: Connection lost The server closed the connection的可能重复 【参考方案1】:

我们解决此问题的方法是检查错误消息,并在必要时重新连接

这就是他们在https://github.com/felixge/node-mysql#server-disconnects 建议的方式

这是示例代码,以防文档发生变化

function handleDisconnect(connection) 
  connection.on('error', function(err) 
    if (!err.fatal) 
      return;
    

    if (err.code !== 'PROTOCOL_CONNECTION_LOST') 
      throw err;
    

    console.log('Re-connecting lost connection: ' + err.stack);

    connection = mysql.createConnection(connection.config);
    handleDisconnect(connection);
    connection.connect();
  );


handleDisconnect(connection);

【讨论】:

我的意思是连接上的“超时”事件,就像 connection.on('timeout', xxxx);我注意到在github.com/felixge/node-mysql 的末尾,待办事项列表包含“setTimeout() for Connection / Query” 我同意,上面的解决方案不能解决超时问题。我在生产中使用上述解决方案,但超时失败:-( 这不会阻止超时发生,但会重新创建连接。我查看了我们使用它的代码,我们实际上是在“关闭”事件上触发重新连接。【参考方案2】:

我遇到了同样的问题,使用方法 mysql.createPool 而不是方法 createConnection 对我有用。

这是我的代码;

/*jslint node: true */
'use strict';
var Q = require('q');

var mysql = require('mysql');
var _config;
var env = process.env.NODE_ENV || 'development';
if (env === 'development') 
  _config = 
    host     : 'localhost',
    user     : 'root',
    charset : 'latin1',
    password : '123456',
    database : 'DEVDB',
    connectionLimit: 10
  ;
else 
  _config = 
    host : 'PRODUCTIONHOST',
    user     : 'root',
    charset : 'latin1',
        password : 'PRODUCTIONPASS',
    database: 'PRODUCTIONDB',
    connectionLimit: 10
  ;


var _pool = mysql.createPool(_config);

var runquery = function() 
  var deferred = Q.defer();
  var args = Array.prototype.slice.call(arguments);

  //console.log(args);
  args.push(function(err, results)
    if (err) 
      deferred.reject(new Error(err));
     else 
      deferred.resolve(results);
    
  );

  _pool.query.apply(_pool, args);

  return deferred.promise;
;


module.exports = runquery;

使用示例;

runquery('select id from users where mail = ?', 'eugenioclrc')
.then(function(rows)
  console.log(rows);
);

【讨论】:

你能详细说明这个答案吗?我也在使用 mysql.createPool 但它不适合我。

以上是关于节点mysql超时的主要内容,如果未能解决你的问题,请参考以下文章

连接节点 v5.10.1 时握手不活动超时错误。到 aws mysql RDS

错误:握手不活动超时(MySQL + Node.js)

grails应用程序中的Mysql连接超时,在ELB上使用mariadb galera集群

HadoopHadoop DataNode节点超时时间设置

mysql怎么设置超时时间

mysql连接超时怎么处理