mysql - 使用 mysql 池时服务器连接超时

标签 mysql node.js socket.io connection-pooling

所以我最近经常遇到这个错误。

Error: Connection lost: The server closed the connection.
at Protocol.end (/home/node_modules/mysql/lib/protocol/Protocol.js:$
at Socket.<anonymous> (/home/node_modules/mysql/lib/Connection.js:1$
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)

我一直在寻找解决方案。我读了很多关于 mysql 池可以解决这个问题的文章,我已经使用了几个星期了。错误仍然弹出。有谁知道为什么会这样?

我正在使用我在 Stackoverflow 上的一个答案中找到的这个基本函数。它处理我所有的查询

var mysql   = require("mysql");
var config = require('./db');
var db = config.database;

var pool = mysql.createPool({
    connectionLimit : 20,
    host: db.host,
    user: db.user,
    password: db.password,
    database: db.database
});


var DB = (function () {

    function _query(query, params, callback) {
        pool.getConnection(function (err, connection) {
            if (err) {
                connection.release();
                callback(null, err);
                throw err;
            }

            connection.query(query, params, function (err, rows) {
                connection.release();
                if (!err) {
                    callback(rows);
                }
                else {
                    callback(null, err);
                }

            });

            connection.on('error', function (err) {
                connection.release();
                callback(null, err);
                throw err;
            });
        });
    };

    return {
        query: _query
    };
})();

module.exports = DB;

我正在执行这样的查询:

    DB.query("SELECT * FROM lists WHERE list_id = ?", [listId], function (result, err) {
console.log(result);

}

最佳答案

MySQL 服务器有一个名为interactive_timeout 的变量,这意味着,如果您的连接空闲 X 秒,服务器将关闭连接。

您可以稍微增加此值,但首选方法是确认超时并在需要查询时使用池中的新连接。

参见 https://github.com/mysqljs/mysql#error-handling

连接池不会阻止任何超时,但连接池可确保您始终有一个连接,或者如果您的应用程序负载很重,则有多个连接。如果您的流量很小,您甚至不需要多个连接,因此,您甚至不需要连接池。

池中的每个连接都会超时,因为使用 release() 不会关闭连接而是将其还给池。

所以你的断开连接是很正常的,你应该适本地处理这个错误。

连接会自动重新创建,请参阅 https://github.com/mysqljs/mysql#poolcluster-options

canRetry (Default: true)
If true, PoolCluster will attempt to reconnect when connection fails. 

如何正确处理错误?

为所有 MySQL 错误准备一个通用错误处理程序:

// Above:
mySqlErrorHandler = function(error) {
    if (error.code == '') { // <---- Insert in '' the error code, you need to find out
        // Connection timeout, no further action (no throw)
    } else {
        // Oh, a different error, abort then
        throw error;
    }
}

// In the function:
connection.on('error', mySqlErrorHandler);

您需要为您的超时找出error.code。这可以通过 console.log(error.code); 来完成。

关于mysql - 使用 mysql 池时服务器连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52198706/

相关文章:

php - Azure 是否支持运行 Laravel 5.5 的正确 PHP 版本?

PHP多行表单,自动化MySQL输入

node.js - 如何在 blessed 中重定向标准输出?

node.js - npm启动错误: Cannot find module 'C:\' and Exit status 8

javascript - 将十六进制字符串转换为 BYTE 数组 JS

php - refresh = on submit in php,如何解决?

mysql - 在 SQL 查询中分组

mysql - 如何将sequelize查询的结果推送到数组

node.js - Flutter WebSockets 连接到 Socket.io 服务器

javascript - socket.io 聊天示例 -sails.js