본문 바로가기

배워서 남주는 코딩

Error: Connection lost: The server closed the connection.

https://www.npmjs.com/package/mysql

 

기본적으로, Node와 Mysql 사이의 호환 문제로 일어난다고 한다.

(이걸 아직도..... // 그냥도 아니고 특정 시간 단위로도 일어나고/// )

 

해결책으로는,,

1. 위에서는 아무 일도 하지 않는 콜백함수를 심으라고(?) 한다.

 

connection.on('error', function() {} );

단, 에러처리를 해놓으면 pm2 로그나 다른 곳에 그 기록은 남으므로 콘솔 정도는 하나 놓는게.

 

2. 스택오버플로에서의 주 의견으로는,

2-1. setTimeout혹은 setInterval과 같이 시간적 거리를 두거나,

2-2. 시작과 종료를 확실히 하거나 (하지만 이건 일부 케이스. 매번 end()를 하지 않아도 된다는 말도 많다)

2-3. connection을 관리하는 함수를 만들어서 관리한다.

(제목으로 검색하면 많이 뜨는 그 스택오버플로.)

 

 

ex1.) 출처 : 스택오버플로 참조, createConnection 방식

 

var mysql = require('mysql');
var mysql_config = {
    host: '127.0.0.1',
    user: 'root',
    password: '123456',
    database: 'workstation'
};

function handleDisconnection() {
   var connection = mysql.createConnection(mysql_config);
    connection.connect(function(err) {
        if(err) {
            setTimeout('handleDisconnection()', 2000);
        }
    });

    connection.on('error', function(err) {
        console.log(err);
        if(err.code === 'PROTOCOL_CONNECTION_LOST') {
            console.log(err);
            handleDisconnection();
        } else {
            throw err;
        }
    });
    exports.connection = connection;
}

exports.handleDisconnection =  handleDisconnection;

 

 

ex2) 역시나 출처는 스택오버플로. 누가 원본인지 모르겠다... pool 방식.

 

var mysql=require("mysql");
var pool = mysql.createPool({
    host: '127.0.0.1',
    user:'root',
    password:'123456',
    database:'workstation'
});

var query = function(sql, options, callback){

    pool.getConnection( function(err, conn){
        if(err) {
            callback(err, null, null);
        }else{
            conn.query(sql, options, function(err, results, fields){
                callback(err, results, fields);
            });
            conn.release();
        }
    });
};

module.exports=query;

 

3. config를 조정한다.

보통 8시간 단위로 되어있다는데, 그래서 포레버로 돌려도 8시간마다 재작동/가동된다는 말///

이를 늘리는 방향으로.

 

되는 걸 골라서 써야 하는,, 자바스크립트한 자바스크립트.