[MySQL] 단일 Connection VS Connection Pool 방식의 차이

주형(Jureamer)·2022년 5월 29일
0
post-thumbnail

개요


어느 날 서버 로그를 살펴보다가 Cannot enqueue Query after fatal error가 찍혀 있어 DB 연결에 문제가 있다는 신호를 받았다.

해당 에러 로그를 확인 해보니 DB 연결 방식때문에 문제가 생긴 듯 했다.
기존 방식은 createConnection을 통한 방식이었고,
이 방식을 connection pool 방식으로 바꾸기 위해 알아보게 되었다.


단일 Connection vs Connection Pool


- 단일 Connection

제일 기본적인 커넥션 방법이다. 말 그대로 단일 커넥션으로,
한 번 생성하여 사용한 뒤, 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 안에 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();
    }
});  

추후 점검 사항



참고


profile
작게라도 꾸준히 성장하는게 목표입니다.

0개의 댓글