Skip to content

Database Connection Pool

#db

참고 자료

  • SpringBoot Application
  • SpringBoot 의 기본 DBCP 로 사용되는 HikariCP
  • Mysql

을 사용하여 DBCP 를 설정하는 방식을 알아보겠습니다.


1. DBCP 의 개념과 원리

excalidraws/dbcp-con.excalidraw.png

  • 매번 connection 을 열고 닫는 시간적인 비용이 발생합니다.
  • 서비스 성능에 좋지 않습니다.

DBCP - Database Connection Pool

=> 미리 커넥션을 만들어두고 Pool 처럼 관리하자!

  • 요청의 시작 전에 TCP 연결을 수립하고 해지 하지 않고 Pool 에서 커넥션을 조회하고 반납하자!

2. MySql

1. max_connections

  • client 와 맺을 수 있는 최대 connection 수 (default = 100)

images/dbcp-max_connections.png

  • mysql 의 max_connections 값이 4 로 설정된 경우
  • 이런 상황에서 새로운 애플리케이션을 추가하거나 HikariCP 의 커넥션 개수를 늘리려고 해도 동작하지 않습니다. 이럴 때는 MySQL 의 max_connections 값을 늘려주어야 합니다.
  • 초과 분에 대해서는 Too Many Connections 에러가 발생합니다.
  • 설정 및 확인 방법 - 링크

2. MySQL - wait_timeout

  • connection 이 idle (inactive) 할 때 다시 요청이 오기까지 얼마의 시간을 기다린 뒤에 close 할 것인지 결정하는 값 (default - 8 시간 (28800 초))
  • 한 쓰레드가 커넥션 풀에서 커넥션을 가져가서 사용하지도 않고 반환하지도 않는 경우 리소스 점유의 문제가 있습니다. 이 문제를 해결하기 MySQL 은 마지막 사용 (요청) 시간을 기준으로 wait_timeout 시간이 초과된다면 connection 을 종료합니다.

참고 자료

  • mysql 의 wait_timeout의 의미
  • wait_timeout 이 가장 중요하지만 mysql 의 다른 여러 timeout 과 관련된 설정들,
  • wait_timeout 설정 꿀팁 에 대한 글입니다.

3. HikariCP 설정

1. minimumIdle

  • Connection Pool 에서 유지하는 최소한의 idle connection 의 개수
  • default - maximumPoolSize 와 같은 값을 가진다.
  • 권장사항
    • 따로 건드리지 말고 maximumPoolSize 와 동일한 값을 써라
    • 이러면 Connection 의 개수가 고정이기 때문에 애플리케이션이 떠 있는 동안 커넥션이 생성되고 종료되지 않는다.

2. maximumPoolSize

  • pool 이 가질 수 있는 최대 connection 수
  • default - 10
  • idle 과 active (in-use) 커넥션의 합

Note

maximumPoolSizeminimumIdle 보다 우선 순위를 가집니다! maximumPoolSize = 4, minimumIdle = 2 인 설정으로 HikraiCP 를 시작하면 minimumIdle 을 만족하기 위해 먼저 두개의 커넥션을 생성합니다. 이 상태에서 하나의 요청이 와서 커넥션 하나가 IN-USE 상태가 된다면 minmumIdle 설정에 따라 Connection 이 하나 추가되고 idle connection 의 최솟값을 2 로 유지할 수 있습니다.

하지만 이 상태에서 추가적인 요청이 두개가 더 온다면 minimumIdle 을 준수하기 위해 Connection 을 두개 더 추가했다가는 maximumPoolSize 가 께지게 됩니다. HikariCP 는 이 때 maximumPoolSize 설정이 minimuIdle 설정에 우선해서 동작하도록 합니다.

참고 링크 - 쉬운코드님 영상 14:41

3. maxLifetime

  • pool 에서 connection 의 최대 수명
  • maxLifetime 을 넘기면 idle 인 경우 pool 에서 바로 제거 active 인 경우 pool 로 반환된 후 제거
  • db 의 connection timeout 보다 몇 초 짧게 설정해야한다.

4. connectionTimeout

  • poll 에서 connection 을 받기 위한 대기 시간
  • default - 30 초

Last update: February 26, 2023
Created: December 26, 2022