반응형
MySQL 연동 애플리케이션에서 커넥션 타임아웃 문제는 자주 발생하는 장애 중 하나다.
사용자 수가 많아지거나 네트워크 환경이 불안정하면, 타임아웃 관련 예외가 로그를 뒤덮게 된다.

⏰ 커넥션 타임아웃이란?
DB 연결과 관련된 타임아웃은 대표적으로 3가지로 나뉜다.
- Connection Timeout
- 커넥션 풀에서 연결을 가져오는 데 걸리는 시간
- 설정값을 초과하면 Timeout waiting for connection 오류 발생
- Socket Timeout
- 연결된 커넥션이 데이터를 주고받지 않고 기다릴 수 있는 최대 시간
- 느린 쿼리 또는 네트워크 문제 시 발생
- MySQL wait_timeout / interactive_timeout
- 커넥션이 유휴 상태로 유지될 수 있는 최대 시간
- 초과 시 MySQL 서버가 커넥션을 강제로 끊음
반응형
🔧 설정 위치별 타임아웃 설정 방법
💡 애플리케이션 쪽 (JDBC URL)
jdbc:mysql://localhost:3306/mydb?
connectionTimeout=30000&
socketTimeout=60000
- connectionTimeout: 커넥션 가져오기 제한 시간 (ms)
- socketTimeout: 읽기/쓰기 대기 제한 시간 (ms)
💡 Spring Boot (HikariCP 기준)
spring:
datasource:
hikari:
connection-timeout: 30000
validation-timeout: 5000
- 단위: 밀리초(ms)
- 너무 짧게 잡으면 오히려 장애를 유발할 수 있으니 30초~60초 권장
💡 MySQL 서버 설정 (my.cnf)
wait_timeout = 28800
interactive_timeout = 28800
- 단위: 초(seconds)
- 기본값은 8시간이지만, 커넥션 풀이 반납하지 않는 경우에는 300~600초로 줄이기도 한다
- 주의: max_connections 수치와 함께 조율해야 연결 끊김 오류 방지 가능
🚫 대표적인 타임아웃 오류와 원인
| 오류 메시지 | 원인 | 해결 방법 |
| Timeout waiting for connection | 커넥션 풀이 고갈 | maximumPoolSize 증가 또는 커넥션 누수 점검 |
| Communications link failure | DB가 커넥션을 끊었음 | wait_timeout 초과 또는 방화벽 |
| SocketTimeoutException | 네트워크 지연 or 쿼리 응답 지연 | 쿼리 성능 개선, socketTimeout 조정 |
| Connection is closed | 커넥션이 만료되어 끊김 | maxLifetime을 wait_timeout보다 짧게 설정 |
반응형
🧪 실무 설정 예시 조합
안정적인 커넥션 유지 목적
hikari:
maximum-pool-size: 20
connection-timeout: 30000
max-lifetime: 1800000
idle-timeout: 600000
# my.cnf
wait_timeout = 600
interactive_timeout = 600
- HikariCP의 max-lifetime은 MySQL의 wait_timeout보다 짧게 설정
- idle-timeout은 너무 짧으면 오히려 연결 재생성 부하가 커질 수 있음
✅ 타임아웃 문제 예방을 위한 팁
- 커넥션은 반드시 사용 후 close()
- 커넥션 풀 설정값은 트래픽 대비 여유 있게 잡을 것
- 비즈니스 로직에서 과도한 DB 연결 요청 없도록 설계
- 장시간 실행되는 쿼리는 반드시 쿼리 튜닝 필요
- 배치 시스템 등 커넥션 유지 시간이 긴 서비스는 별도 설정 권장
📘 공식 문서 참고
- https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
- https://github.com/brettwooldridge/HikariCP
반응형
'DB' 카테고리의 다른 글
| [MySQL] 문자열 길이 함수: LENGTH vs CHAR_LENGTH 정리 (3) | 2025.07.19 |
|---|---|
| [MySQL] (연결최적화6️⃣) 실무 연결 설정 체크리스트 총정리 (1) | 2025.07.19 |
| [MySQL] (연결최적화5️⃣) 커넥션 누수 원인 진단과 해결 전략 (1) | 2025.07.18 |
| [MySQL] (연결최적화4️⃣) 트랜잭션 전파 방식과 커넥션 이슈 분석 (0) | 2025.07.18 |
| [MySQL] (연결최적화2️⃣) 커넥션 풀의 개념과 실무 설정 가이드 (0) | 2025.07.18 |
| [MySQL] (연결최적화1️⃣) JDBC 드라이버 설정 핵심 옵션 정리 (0) | 2025.07.18 |
| [MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음 (0) | 2025.07.18 |
| [MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항 (0) | 2025.07.18 |