Тайм-аут подключения к серверу при использовании пула MySQL - PullRequest
0 голосов
/ 06 сентября 2018

Так что в последнее время я часто получаю эту ошибку.

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 pooling решит эту проблему, которую я использую уже несколько недель. Ошибка все еще выскакивает, хотя. Кто-нибудь знает, почему это может быть?

Я использую эту базовую функцию, которую я нашел в ответе на 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);

}

1 Ответ

0 голосов
/ 07 сентября 2018

MySQL Server имеет переменную с именем 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);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...