풀 타임아웃

커넥션 풀에서 사용 가능한 커넥션을 얻기까지 기다리는 최대 시간입니다. 풀이 가득 찼을 때 커넥션을 대기하는 시간입니다.

왜 필요한가?

동작 방식

[커넥션 풀 - 최대 10개]
┌─────┬─────┬─────┬─────┬─────┐
│사용중│사용중│사용중│...  │사용중│  ← 모두 사용 중
└─────┴─────┴─────┴─────┴─────┘
              ↑
         11번째 요청
              │
    Pool Timeout (예: 3초)
              │
    3초 내 반환 없으면
              ↓
    ConnectionPoolTimeoutException

세 가지 타임아웃 비교

타임아웃대기 대상상황
Connection Timeout서버와 연결TCP 연결 수립
Read Timeout서버 응답데이터 수신
Pool Timeout풀에서 커넥션풀이 가득 참
[요청 흐름]

풀에서 커넥션 획득 ──▶ 서버 연결 ──▶ 응답 대기
        │                  │            │
   Pool Timeout      Connection     Read
                      Timeout       Timeout

설정 예시

Apache HttpClient

PoolingHttpClientConnectionManager cm =
    new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100);           // 전체 최대 커넥션
cm.setDefaultMaxPerRoute(20);  // 호스트당 최대 커넥션

RequestConfig config = RequestConfig.custom()
    .setConnectTimeout(3000)                    // 연결 타임아웃
    .setSocketTimeout(5000)                     // 리드 타임아웃
    .setConnectionRequestTimeout(3000)          // 풀 타임아웃
    .build();

CloseableHttpClient client = HttpClients.custom()
    .setConnectionManager(cm)
    .setDefaultRequestConfig(config)
    .build();

RestTemplate (Spring)

PoolingHttpClientConnectionManager cm =
    new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100);
cm.setDefaultMaxPerRoute(20);

RequestConfig config = RequestConfig.custom()
    .setConnectionRequestTimeout(3000)  // 풀 타임아웃
    .build();

CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cm)
    .setDefaultRequestConfig(config)
    .build();

HttpComponentsClientHttpRequestFactory factory =
    new HttpComponentsClientHttpRequestFactory(httpClient);

RestTemplate restTemplate = new RestTemplate(factory);

HikariCP (DB 커넥션 풀)

spring:
  datasource:
    hikari:
      maximum-pool-size: 10
      connection-timeout: 3000  # 풀에서 커넥션 얻는 시간

풀 타임아웃 발생 원인

1. 트래픽 급증 → 커넥션 부족
2. 느린 쿼리/API → 커넥션 반환 지연
3. 커넥션 누수 → 반환 안 됨
4. 풀 크기 부족

적절한 설정값

항목권장값
Pool Timeout1~3초
Max Pool Size트래픽에 맞게
Max Per Route호스트당 적절히 분배

타임아웃 발생 시 대응

try {
    restTemplate.getForObject(url, String.class);
} catch (ResourceAccessException e) {
    if (e.getCause() instanceof ConnectionPoolTimeoutException) {
        // 풀 부족 → 스케일링 또는 풀 크기 조정 필요
        log.warn("커넥션 풀 부족");
    }
}

CSLOG에서 보기