-
DBMS Connection pool 이 뭐임TodayILearned/TILWIL 2022. 9. 30. 01:36
postgresql Connection pool
RDBMS connection pool
DBMS는 자체적으로 서버와 클라이언트를 갖고있다. (데이터를 요청하는쪽이 클라이언트, 요청을 받아 처리하는쪽이 서버.)
connection pool 이란 DB의 서버-클라이언트간의 연결 객체를 의미한다.
데이터베이스 연결에 드는 비용
데이터베이스에 연결하는 것은 아래처럼 여러 단계를 거쳐야하는 리소스가 많이 필요한 작업이다. 그러나 연결을 닫지않고 열린 상태로 유지하는 것 또한 리소스를 소모한다.
- 애플리케이션은 연결을 하기위해 DB driver를 사용한다.
- 네트워크 소켓이 애플리케이션과 DB를 연결하기위해 열린다.
- 유저 인증됨
- 작업이 완료되고 연결은 닫힌다.
- 네트워크 소켓이 닫힌다.
DB connection pooling을 하는 이유
간단한 작업의 경우, 연결을 하고, 닫는 프로세스에 들이는 비용을 걱정하지 않아도 된다. 하지만 애플리케이션이 확장됨에 따라 연결을 지속적으로 열고, 닫는데 드는 비용이 더 많이 들고 애플리케이션에 영향을 줄 수 있다. 따라서, 새로운 연결을 열고 닫는 것 보다 열린 상태로 유지하고 필요한 작업에 전달하는 방법이 더 효율적이다.
적절한 Connection pool의 크기?
최대 connection pool이 실제 연산의 빈도수보다 적으면, 가능한 연결이 열릴 때 까지 기다려야하므로 대기시간이 발생한다. 반면 너무 많은 연결을 열어놓는다면 한정된 서버 프로세서가 Connection pool을 연결하는것에 대한 대기시간이 생길 수 있다.
따라서, 완벽한 공식은 없지만 아래 문서가 참고할 만 하여 첨부했다.
- 많은 수의 connection pool도 답이 아니고
- 적은 수의 connection pool도 답이 아니다.
- 최대 pool의 절반 정도로 시작해서 성능에 따라 조절하는 것이 좋다.
https://docs.digitalocean.com/products/databases/postgresql/how-to/manage-connection-pools/
TypeORM에서의 connection pool
queryRunner를 통해 connection pool을 관리할 수 있다.
작업이 완료된 연결은 다른 작업을 위해 release 시켜줘야한다.
make sure to release it when it is not needed anymore to make it available to the connection pool again:
await queryRunner.release()
queryRunner instance는 EntityManager 인스턴스가 가지고있는 메서드를 갖고있다.
EntityManager는 엔티티를 삽입,수정,삭제,업데이트하는 역할을한다.참고한 글
https://www.cockroachlabs.com/blog/what-is-connection-pooling/
https://jojoldu.tistory.com/634
'TodayILearned > TILWIL' 카테고리의 다른 글
Nest Cache (0) 2022.09.28 gRPC 동작순서 (0) 2022.08.12 asynchronous-synchronous programming (0) 2022.05.02 왜 타입스크립트 마이그레이션을 해야할까 (0) 2022.05.01 클래스 개념과 프로토타입 개념 (0) 2021.12.15