TIL(Today I Learned)

TIL - Connection Pool

Happy._. 2024. 7. 10. 23:06

Connection Pool

  • 데이터베이스와의 연결을 미리 생성해 두고 필요할 때 재사용하는 기술
  • 매번 연결을 새롭게 생성/종료하는 것보다 훨씬 효율적
  • 시스템 부하를 줄이고 성능을 향상시키는 데 도움

Spring Boot는 HikariCP를 기본 Connection Pool로 사용한다.

Hikari CP

  • Spring Boot 2.0부터 기본으로 설정되어 있는 DB Connection Pool Library
  • 빠른 DB 접속 가능: DB 접속 설정 객체를 미리 생성 및 연결해 메모리 상에 등록해 놓기 때문에 클라이언트가 빠르게 DB에 접속 가능
  • 서버 자원 고갈 방지: DB Connection 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈을 방지
  • 쉬운 유지보수: DB 접속 모듈을 공통화해 DB 서버의 환경이 바뀔 경우 쉽게 유지보수 가능
  • 비용 절감: 연결이 끝난 Connection을 재사용함으로써 새 객체 생성 비용을 줄일 수 있음

Hikari CP Property

  • maximumPoolSize
    • Connection Pool이 가질 수 있는 최대 Connection 개수
    • 기본값: 10 / 최대(권장): 50
  • minimum-idle
    • Connection Pool이 최소한으로 유지하려는 Connection 개수
    • 기본값: maximumPoolSize와 동일
      • minimum-idel 값을 지정하지 않고, maximumPoolSize를 50으로 지정 시 minimum-idel 도 50
  • connectionTimeout
    • Client가 Pool에서 Connection을 기다리는 최대 시간
    • 시간이 초과하면 SQLException이 발생
    • 기본값: 30000(30초) / 최소: 250
  • idle-timeout
    • Pool에서 Connection이 유휴한 상태로 허용되는 최대 시간
    • minimum-idle이 maximumPoolSize보다 작게 정의될 때만 적용
    • 기본값: 600000(10분) / 최소: 10000(10초) / 0으로 설정 시 유휴 Connection이 Pool에서 제거 X
  • keepaliveTime
    • Connection 유효여부 확인 주기 설정
    • 유효하지 않은 경우 Connection Pool에서 제거
    • maxLifeTime 보다 짧아야 하며, 긴 경우 이미 제거된 이후 검증으로 무의미
    • 기본값: 0(disable) / 최소: 30000(30초)
  • maxLifetime
    • 풀에 존재하는 Connection의 최대 Lifetime(설정하는 것을 권장)
    • 사용 중인 Connection은 제거 X, Connection이 닫히고 나서 제거 O
    • DB나 Infra의 Connection time보다 짧아야 하며, 같거나 길다면 Infinite Lifetime
    • 기본값: 1800000(30분) / 최소: 30000(30초) / 0으로 설정 시에도 Infinite Lifetime
  • pool-name: Connection Pool Name(설정하지 않으면 자동 생성)
  • validation-timeout
    • Connection 유효성 검사에 대한 timeout 설정
    • connectionTimeout 보다 짧아야 함
    • 기본값: 5000 / 최소: 250
  • auto-commit
    • auto commit 여부
    • 기본값: true

https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing

  • 데이터베이스 연결 풀의 크기를 결정하는 데 중요한 원칙 중 하나는 최소한의 연결을 유지하는 것
  • 스레드 수가 CPU 코어 수를 초과하면 더 많은 스레드를 추가함으로써 더 느려지게 되므로 최소한으로 유지하는 것이 중요
  • A와 B를 동시에 실행하는 것보다 순차적으로 실행하는 것이 항상 더 빠르다.