mysql - Node.js MySQL 需要持久连接

标签 mysql node.js node-mysql

我的 Node Web 应用需要一个持久的 MySQL 连接。问题是这种情况每天大约会发生几次:

Error: Connection lost: The server closed the connection.
at Protocol.end (/var/www/n/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:895:16
at process._tickCallback (node.js:415:13)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
info: socket.io started

这是我的连接代码:

// Yes I know multipleStatements can be dangerous in the wrong hands.
var sql = mysql.createConnection({
    host: 'localhost',
    user: 'my_username',
    password: 'my_password',
    database: 'my_database',
    multipleStatements: true
});

sql.connect();

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);
        sql = mysql.createConnection(connection.config);
        handleDisconnect(sql);
        sql.connect();
    });
}

handleDisconnect(sql);

如您所见,handleDisconnect 代码不起作用..

最佳答案

使用mysql连接池。当连接断开时它将重新连接,并且您可以获得能够同时进行多个 sql 查询的额外好处。如果您不使用数据库池,您的应用将在等待当前正在运行的数据库请求完成时阻止数据库请求。

我通常定义一个数据库模块,将查询与路由分开。它看起来像这样......

var mysql = require('mysql');
var pool  = mysql.createPool({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret'
});

exports.getUsers = function(callback) {
  pool.getConnection(function(err, connection) {
    if(err) { 
      console.log(err); 
      callback(true); 
      return; 
    }
    var sql = "SELECT id,name FROM users";
    connection.query(sql, [], function(err, results) {
      connection.release(); // always put connection back in pool after last query
      if(err) { 
        console.log(err); 
        callback(true); 
        return; 
      }
      callback(false, results);
    });
  });
});

关于mysql - Node.js MySQL 需要持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17015590/

相关文章:

javascript - 无法通过 SSH 连接到 MySQL

javascript - connection.query() 外部的变量不会更新

mysql - 如何查询连接表以满足多个条件?

MySQL:连接语句:为什么这不起作用?

MySql,如何通过比较2个Json来选择数据

node.js - 开机自动启动node.js服务器

mysql - 在查询中序列化 MySQL 关系数据

node.js - Jade 中元素的动态宽度

javascript - 发送错误后无法设置 header 。我没有调用 render()/json() 两次

mysql更新查询在一般日志中但数据没有改变