어느 날 서버 로그를 살펴보다가 Cannot enqueue Query after fatal error
가 찍혀 있어 DB 연결에 문제가 있다는 신호를 받았다.
해당 에러 로그를 확인 해보니 DB 연결 방식때문에 문제가 생긴 듯 했다.
기존 방식은 createConnection
을 통한 방식이었고,
이 방식을 connection pool
방식으로 바꾸기 위해 알아보게 되었다.
제일 기본적인 커넥션 방법이다. 말 그대로 단일 커넥션으로,
한 번 생성하여 사용한 뒤, end, destory 등으로 삭제하고 재생성됨에 따라
handshake 비용, 프로세스 혹은 스레드 비용이 증가한다는 단점이 존재한다.
// 단일 Connection 예시
var mysql = require('mysql');
var connection = mysql.createConnection(
{
// 연결 객체 생성
host : '호스트 이름',
user: '사용자',
password : '비밀번호'
});
// 연결
connection.connect();
// query 실행
connection.query("SELECT * FROM user WHERE user_name like 'kim%'", function(err, results)
{
console.log( fields );
console.log( results );
});
// mysql 연결 종료 ( 커넥션 종료 메소드가 커넥션 풀과 다르다 )
connection.end();
Connection Pool은 미리 필요한 수 만큼 Connection을 만들어 놓는 개념이다.
위의 그림에 따르면 Pool 안에 Connection을 만들어 놓고 사용할 때 꺼내서 쓰고 반환 시, 다시 Pool에 넣어놓는다.
단일 Connetion과는 다르게 Connection을 다시 생성하는 데 연결 시간(비용)이 소비되지 않는 장점이 있어 그 만큼 애플리케이션의 실행 / 검색 속도가 빨라지게 된다.
하지만 Pool 또한 필요량보다 적게 해놓으면 대기시간(Pending)이 발생할 수 있고, 너무 많이 해놓을 경우 메모리 소모가 크다는 단점이 있어 메모리 상황과 사용자 수에 맞게 조절해서 써야한다.
// Connection Pool 예시
var mysql = require('mysql');
var pool = mysql.createPool(
{
// 연결 객체 생성
host : '호스트 이름',
user: '사용자',
password : '비밀번호',
connectionLimit: '연결제한수'
});
// 연결
pool.getConnect(function(err, connection) {
if(err)
throw err;
else {
// query 실행
connection.query(
"SELECT * FROM user WHERE user_name like 'kim%'", function(err, results) {
console.log( results );
});
// connection을 pool로 반환
connection.release();
}
});