DB 커넥션 풀 튜닝 실패 사례 분석

Spring Boot는 기본적으로 HikariCP를 사용합니다.
대부분 개발자는 다음 설정만 보고 넘어갑니다.

 
spring:
datasource:
hikari:
maximum-pool-size: 10
connection-timeout: 30000
max-lifetime: 1800000
 

하지만 이 설정을 제대로 이해하지 못하면 운영 환경에서 장애가 발생합니다.

이번 글에서는 실무에서 실제로 자주 발생하는 HikariCP 장애 5가지 사례를 정리합니다.


1. Connection Pool Exhausted

(커넥션 풀 고갈)

가장 흔한 장애입니다.

로그

HikariPool-1 - Connection is not available, request timed out
 

의미

커넥션 풀에 남은 DB 연결이 없음
 

 


발생 상황

maximum-pool-size = 10
 

동시에

20개 요청 발생
 

구조

10개 → DB 실행
10개 → 대기
 

대기 시간이 connection-timeout을 넘으면

SQLTransientConnectionException
 

이 발생합니다.


해결 방법

1️⃣ 커넥션 풀 증가

maximum-pool-size: 20
 

2️⃣ 느린 쿼리 제거

3️⃣ 트랜잭션 범위 축소


2. DB Max Connection 초과

이건 DB 서버가 죽는 케이스입니다.

PostgreSQL max_connections = 100
 

애플리케이션 서버 5대

pool = 30
 

전체 커넥션

30 * 5 = 150
 

결과

FATAL: too many connections
 

DB가 새로운 연결을 거부합니다.


해결 방법

커넥션 풀은 항상 다음 기준으로 잡아야 합니다.

(DB max_connections - 관리용) / 서버 수
 

100 - 20 = 80
80 / 4 servers = 20
 

따라서

maximum-pool-size = 20
 

3. Broken Pipe / Connection Reset

운영에서 많이 보는 로그입니다.

org.postgresql.util.PSQLException: Connection reset
 

또는

Broken pipe
 

원인

DB 또는 네트워크가 idle connection을 끊음
 

  • AWS RDS
  • NAT Gateway
  • Firewall

이 경우 커넥션 풀에 죽은 커넥션이 남아있습니다.


해결 방법

max-lifetime을 DB timeout보다 작게 설정합니다.

DB idle timeout = 1시간
 

설정

max-lifetime = 30분
 
 
max-lifetime: 1800000
 

 


4. Thread Pool 고갈

이건 커넥션 풀 문제지만 웹 서버까지 영향을 줍니다.

connection-timeout = 5분
 

커넥션 풀이 부족하면

요청 Thread 대기
 

이 상태가 됩니다.

Tomcat 구조

Request

Tomcat Thread

DB Connection Pool
 

커넥션이 없으면

Thread block
 

결과

Tomcat thread pool exhausted
 

서버가 응답을 못 합니다.


해결 방법

connection-timeout을 크게 잡지 않습니다.

보통

30초
 

정도가 적절합니다.


5. 커넥션 누수 (Connection Leak)

가끔 이런 로그가 보입니다.

HikariPool - Connection leak detection triggered
 

의미

커넥션을 반환하지 않음
 

 
Connection conn = dataSource.getConnection();
 

닫지 않으면

pool 고갈
 

이 발생합니다.


해결 방법

Spring에서는 대부분 다음을 사용합니다.

@Transactional
JpaRepository
JdbcTemplate
 

이 경우 자동으로 반환됩니다.

그래서 직접

getConnection()
 

을 쓰지 않는 것이 좋습니다.


6. 실무 추천 설정

보통 Spring Boot 운영 환경에서는 이렇게 시작합니다.

 
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
 

7. 커넥션 풀 설계 기준

설계할 때 고려해야 할 것

CPU 코어 수
DB max_connections
서버 수
트래픽 TPS
쿼리 시간
 

간단한 공식

pool ≈ CPU * 2
 

CPU 4 core
pool = 8 ~ 16
 

정리

HikariCP 설정은 단순한 옵션처럼 보이지만 운영 장애와 직결됩니다.

특히 다음 세 가지를 항상 함께 고려해야 합니다.

maximum-pool-size
connection-timeout
max-lifetime
 

이 설정은 애플리케이션 성능이 아니라 DB 안정성을 위한 설정입니다.


✔ 핵심 한 줄

DB 장애의 30%는 커넥션 풀 설정에서 시작된다.
LIST

+ Recent posts