DB Connection Pool이 필요한 이유
# DB Connection
어플리케이션이 DB server와의 통신을 위한 연결로 SQL 문을 보내고 그 결과값을 받기 위해 사용한다. 데이터베이스 서버도 앱서버와 같이 특정 포트 (예를 들어, MySQL 데이터베이스 서버는 기본 3306
)로 떠 있으며, 이 서버와 백엔드 서버가 TCP-IP protocol로 Connection을 맺는다. 이때, 필요에 따라 user name, password와 같은 credentials 가 필요할 수도 있다.
DB Connection을 맺기 위해서는 DB Host, Port, database name, driver, user name, password 등이 필요하다.
|
|
# DB Connection 생애주기
(ref : https://vladmihalcea.com/wp-content/uploads/2014/04/connectionlifecycle.gif)
- DB로 Connection을 처음 연결 시도 한다.
- Connection을 실제로 열기 전, user credential 이 유효한지 인증 검사를 한다.
- 검사를 통과하면 TCP socket을 연다.
- SQL 문이 들어오면 이에 대한 결과 데이터를 보내준다.
- DB Connection을 닫는다.
- TCP socket이 닫힌다.
위에서 보다시피 DB Connection을 맺는 것은 매우 비싸고 시간이 많이 드는 작업이다. 그렇기 때문에 필요할 때마다 connection을 맺는 것은 어플리케이션 자체 속도를 늦춰서 서비스 품질에 악영향을 끼칠 수 있다. 또 각각의 요청마다 connection을 맺게되면 동시에 너무 많은 connection이 만들어지게 되며 DB server의 CPU와 memory를 너무 많이 사용하여 resource 부족 문제를 야기할 수 있다.
이 문제를 풀기 위하여 Connection Pool을 사용한다. 미리 Connection을 맺어두고 어플리케이션에서는 이미 만들어진 Connection을 재사용(reuse)한다.
(ref:https://raw.githubusercontent.com/practicalli/graphic-design/live/practicalli-clojure-webapps-database-postgres-no-connection-pool.png)