服务器NodeJ在空闲时间崩溃,该如何解决?

时间:2018-10-31 09:04:12

标签: mysql node.js

我的服务器api位于alwayse alwaysdata上。 x时间过后,服务器崩溃。

events.js:183
  throw er;
 // Unhandled 'error' eventError: Connection lost: The server closed the connection.
at Protocol.end (/home/ec2-user/node_modules/mysql/lib/protocol/Protocol.js:112:13)
at Socket.<anonymous> (/home/ec2-user/node_modules/mysql/lib/Connection.js:97:28)
at Socket.<anonymous> (/home/ec2-user/node_modules/mysql/lib/Connection.js:502:10)
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:139:11)
at process._tickCallback (internal/process/next_tick.js:181:9)

我正在查看这是否与mysql错误无关。但是现有的帖子对我没有帮助。我认为服务器mysql切断了连接,我不知道为什么。 在这里我建立了连接:

let con = mysql.createConnection({
            host: "alwaysdata.net",
            user: "user",
            password: "",
            database: "database"
        });

        try {
            con.query(check, (err, customer) => {
            if (err){
                console.log("%s Error on check query",Date());
                throw err;
            }

4 个答案:

答案 0 :(得分:0)

我相信您可以通过两种方式处理此问题。

  • 1)强制MySQL使连接保持活动状态(不是官方的,但我相信会成功的)。
  • 2)处理mysql服务器与Node的断开连接 视图。

对于这两个例子,都有一个很好的例子here

  

服务器断开连接

     

由于网络问题,您可能会失去与MySQL服务器的连接,   服务器使您超时,服务器重新启动或崩溃。   所有这些事件都被认为是致命错误,并且具有   err.code ='PROTOCOL_CONNECTION_LOST'。请参阅错误处理部分   有关更多信息。

     

通过建立新连接来重新连接。   终止后,无法重新连接现有的连接对象   通过设计。

     

使用池,断开的连接将从池中删除   释放空间以在下一个创建新连接   getConnection调用。

答案 1 :(得分:0)

let connection=null;
function handleDisconnect() {
    connection = mysql.createConnection({
        host: "alwaysdata.net",
        user: "user",
        password: "",
        database: "database"
    }); // Recreate the connection, since
    // the old one cannot be reused.

    connection.connect(function (err) { // The server is either down
        if (err) { // or restarting (takes a while sometimes).
            console.log('error when connecting to db:', err);
            setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
        } // to avoid a hot loop, and to allow our node script to
    }); // process asynchronous requests in the meantime.
    // If you're also serving http, display a 503 error.
    connection.on('error', function (err) {
        console.log('db error', err);
        if (err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
            handleDisconnect(); // lost due to either server restart, or a
        } else { // connnection idle timeout (the wait_timeout
            throw err; // server variable configures this)
        }
    });
}
handleDisconnect();
setInterval(function () {
    connection.query('SELECT 1');
}, 5000);

module.exports = connection;

您导出连接对象,并将其用于其他连接查询。

我每5秒调用一次Query来保持连接状态,我尝试了所有其他方法,而这种方法就像一种魅力。

答案 2 :(得分:0)

尝试连接池:

const mysql = require('mysql');
let pool  = mysql.createPool(
    {
        connectionLimit : 100,
        host : '172.17.0.1',
        port : 3306,
        user : 'test',
        password : 'test',
        database : 'test',
        multipleStatements: true
    }
);

...
pool.query(sql, params, function(err, rows) {
...

它在我的mysql 5.7和8版本上稳定运行

答案 3 :(得分:0)

Manish 的回答对我有用!

过去两天我一直在为此苦苦挣扎。我在我的本地主机上运行了一个带有 mysql db 的 nodejs 服务器,在使用 cleardb 插件迁移到 heroku 后,我遇到了几个问题。我在配置文件中有此代码:

const mysql = require('mysql');

const db = mysql.createConnection({
    host: 'host',
    database: 'database',
    user: 'user',
    password: 'password', });
module.exports = db;

我将其更改为 Manish 提到的处理断开连接的方法。