풀 타임아웃
커넥션 풀에서 사용 가능한 커넥션을 얻기까지 기다리는 최대 시간입니다. 풀이 가득 찼을 때 커넥션을 대기하는 시간입니다.
왜 필요한가?
- 커넥션 풀이 가득 찼을 때 무한 대기 방지
- 트래픽 폭주 시 빠른 실패 처리
- 시스템 안정성 확보
동작 방식
[커넥션 풀 - 최대 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 Timeout | 1~3초 |
| Max Pool Size | 트래픽에 맞게 |
| Max Per Route | 호스트당 적절히 분배 |
타임아웃 발생 시 대응
try {
restTemplate.getForObject(url, String.class);
} catch (ResourceAccessException e) {
if (e.getCause() instanceof ConnectionPoolTimeoutException) {
// 풀 부족 → 스케일링 또는 풀 크기 조정 필요
log.warn("커넥션 풀 부족");
}
}