[1.17]Database Connection Pool

Always·2025년 1월 17일
1

매일메일

목록 보기
21/69

https://www.maeil-mail.kr/question/88
요약: 데이터베이스 커낵션 풀의 갯수를 조정해서, 데이터베이스의 연결 수립시, 데드락이 걸리게 하지 않고, 나은 퍼포먼스를 수행하게 하는 것은 필수적이다.

데이터베이스 커낵션풀

우리의 웹 어플리케이션이 데이터베이스와 소통을 하려고 한다고 해보자. 데이터베이스는 웹 어플리케이션과 구조가 다르므로, 둘을 연결 시켜주는 데이터베이스 드라이버 가 필수적이다.
데이터베이스 드라이버를 이용해서 웹 어플리케이션은 다음과 같은 통신 과정을 거친다.

  1. 데이터베이스 드라이버를 통해서 데이터베이스 연결을 한다.
  2. 데이터를 읽고 쓰는 tcp 소켓을 연다.
  3. tcp소켓을 통해서 통신(읽기,쓰기) 작업을 수행한다.
  4. 수행이 끝나면 데이터베이스 연결을 해제한다.
  5. tcp 소켓을 닫는다.

그런데, 만약 데이터베이스를 접근하는 요청이 올 때마다, 위의 과정을 거친다면, 빠른 시간내에 작업이 안될 것이며,
더불어, 데이터베이스에서 연결을 할 수 있는 최대 갯수가 정해져 있기 때문에, 위의 초기화 과정을 계속 거친다면, 많은 데이터 처리에 대해서 작업의 수행이 안될 것이다.

그렇기에 데이터베이스 커낵션 풀을 이용하는 것이다.
커낵션 풀에는 이미 데이터베이스의 연결과정을 수행해둔, 커낵션이 일정갯수가 들어 있다. 따라서 실제로 위처럼 드라이버를 거치는 과정은 어플리케이션이 실행될 때만이고, 그 이후에는 커낵션을 획득해서 데이터베이스와의 통신을 한다.

출처: https://hudi.blog/dbcp-and-hikaricp/

커낵션 풀을 사용하는 것은 다음과 같은 장점을 가진다.

  1. 데이터베이스의 연결할 때마다의 초기화 과정에서 드는 시간적 비용을 줄일 수 있다.
  2. 해당 쓰레드 및 트랜잭션이 끝나면 커낵션이 반환되므로, 이후에 커낵션을 재사용할 수 있다.
  3. 커낵션풀을 이용해서 트랜잭션의 전파를 유용하게 활용이 가능하다.

HikariCP Pool


출처: https://github.com/brettwooldridge/HikariCP
여러 커낵션 풀들이 존재하는데 이 중 HikariCP의 성능이 가장 좋다.
위에서 ops/ms 즉 operaton/ms인 ms대비 수행횟수가 Hikari에서 제공하는 pool이 압도적으로 좋은 것이 위에서 볼 수 있다.

Connection Cycle,Statement Cycle 모두 Hikari가 압도적으로 좋은 것을 위의 그래프로부터 알 수 있다.

HikariCP에서는 아래와 같은 공식을 통해서 초기 커낵션 갯수를 제안한다.

connection=((core_count∗2)+effective_spindle_count)

core_count 는 CPU의 코어수를,
effective_spindle_count는 DB서버가 동시 관리할 수 있는 IO 개수이다.
출처: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing#the-formula

또한 데드락을 막기 위한 최소한의 커낵션으로 아래와 같은 공식을 Hikari에서 제공한다.

여기서 T는 was의 전체 쓰레드 갯수, C는 해당 쓰레드가 필요로하는 커낵션의 갯수이다.
최소한 이 이상의 커낵션이 필요하므로, 이것 +a가 필요할 것이다.

해당 내용에 대해서는 후에 따로 벨로그의 포스팅에서 분석을 해볼 것이다.

profile
🐶개발 블로그

0개의 댓글