[Node] Connection lost: The server closed the connection

NHJ·2021년 12월 23일
0

[문제]

Nodejs, Mysql, Docker, AWS EC2등을 이용하여 프로젝트를 진행하던 중 가끔씩 사이트에 접속한 뒤 일정시간이 지나면 다음과 같이 웹사이트에 접속이 되지않는 문제점이 발견되었다.

그래서 docker에서 log를 읽어봤는데 Error: Connection lost: The server closed the connection 라는 에러메세지가 있었다.

npm mysql문서를 읽어보니 위와 같은 문장이 있었다. 에러는 mysql에서 일정시간동안 활동하지 않는 connection이 있으면 끊어버려서 발생하는 것이었다.

[해결]

var db_config = {
  host: 'localhost',
    user: 'root',
    password: '',
    database: 'example'
};

var connection;

function handleDisconnect() {
  connection = mysql.createConnection(db_config); 

  connection.connect(function(err) {              
    if(err) {                                     
      console.log('error when connecting to db:', err);
      setTimeout(handleDisconnect, 2000); 
  connection.on('error', function(err) {
    console.log('db error', err);
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { 
      handleDisconnect();                         
    } else {                                      
      throw err;                                  
    }
  });
}

handleDisconnect();

첫째로 코드를 다음과 같이 작성하여 DB와 연결이 끊어졌을때 다시 연결을 시도하도록 한다.

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',
  database : 'example'
});
 
connection.connect();
 
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});
 
connection.end();

두번째는 query 실행 후 connection.end()를 통해 connection을 종료시켜줬는지 확인하는 것이다. 내가 진행했던 프로젝트에서 나타났던 문제점이었다.

마지막으로 interactive_timeout, wati_timeout값을 적정한 값으로 수정하는것이다. 이는 활동하지 않는 connection을 끊을때까지 서버가 대기하는 시간이고 mysql의 경우는 28800초로 8시간이다.

[참고]

profile
화이팅!

0개의 댓글

관련 채용 정보