커넥션 풀(DBCP)의 개념
웹 컨테이너(WAS)가 실행되면 데이터베이스에 연결된 Connection을 미리 만들어서 pool에 저장한다. 그 후, 클라이언트 요청이 오면 pool에서 Connection 객체를 빌려준다. 해당 객체의 임무가 완료되면 다시 Connection 객체를 반납 받아서 pool에 저장하는 프로그래밍 기법이다.
커넥션 풀 순서
- 사용자가 DB를 사용하기 위하여 Connection을 요청한다.
- Connection Pool에서 사용되지 않고 있는 Connection 객체를 제공한다.
- 사용자가 Connection 객체를 사용 완료하면 pool로 반환한다.
커넥션 풀(DBCP)의 장점
- DB 접속 설정 객체를 미리 만들어 연결하여 메모리 상에 등록해 놓기 때문에 불필요한 작업(커넥션 생성, 삭제)이 없다. 클라이언트가 빠르게 DB에 접속이 가능하다.
- DB Connection Pool을 이용하면 여러 Connection을 이용할 수 있기 때문에 부하를 견딜 수 있다. 또한, 과도한 접속으로 인한 서버 자원 고갈 방지가 가능하다.
- DB 접속 모듈을 공통화하여 DB 서버의 환경이 바뀔 경우 쉬운 유지 보수가 가능하다. 필요할때 마다 Connection을 생성하고 닫지 않아도 되기 때문에 어플리케이션의 성능향상 또한 기대할 수 있다.
- 연결이 끝난 Connection을 재사용함으로써 새로 객체를 만드는 비용을 줄일 수 있다.
커넥션 풀(DBCP)의 유의 사항
동시 접속자가 많을 경우에 너무 많은 DB 접근이 발생한다. 이 경우에 커넥션은 한정되어 있기 때문에 쓸 수 있는 커넥션이 반납될 때까지 기다려야 한다. 너무 많은 커넥션을 생성할 시에는 커넥션 또한 객체이므로 많은 메모리를 차지하게 되고, 프로그램의 성능을 떨어뜨리는 원인이 된다.
WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기 시간이 줄어 들고, 반대로 커넥션 풀을 작게 설정하면 그만큼 대기 시간이 길어진다. 따라서 사용량에 따라 적정량의 커넥션 객체를 생성해 두어야 한다.
커넥션 풀의 사용 방법
{
"host": "<host>",
"user": "<username>",
"password": "<password>",
"database": "<database>",
"connectionLimit": 30
}
앞서 설정한 mysql(node.js)에서 설정한 것을 따로 파일로 만들어 db_config.json으로 파일이름을 저장하여 만들어 둔다.
- connectionLimit : 최대 컨넥션 개수 (default: 10)
- 위의 옵션을 추가하여 최대 컨넥션의 개수를 지정할 수 있다. git을 이용할 경우 위와 같이 설정을 json파일로 빼고 .gitignore에 추가해야 한다.
const mysql = require('mysql');
const config = require('./db_config.json');
var pool = mysql.createPool(config);
pool.getConnection(function(err, conn) {
if(!err) {
//연결 성공
conn.query(...);
}
conn.release();
});
mysql의 connection pool을 만든 것을 pool로 변수 선언을 해준다. 그리고 getConnection을 통해 pool에서 connection을 가져다 사용해야 한다.
pool을 사용하고 나서는 conn.release()를 통해 pool에 반납해주어야 한다.
아래의 사이트를 참고하였습니다.
https://techbless.github.io/2020/01/17/Node-js에서-Mysql-Connection-Pool-이용하기/