DB

[MySQL] (연결최적화3️⃣) 커넥션 타임아웃 설정과 오류 해결법

인생아 2025. 7. 18. 21:35
반응형

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

⏰ 커넥션 타임아웃이란?

DB 연결과 관련된 타임아웃은 대표적으로 3가지로 나뉜다.

  1. Connection Timeout
    • 커넥션 풀에서 연결을 가져오는 데 걸리는 시간
    • 설정값을 초과하면 Timeout waiting for connection 오류 발생
  2. Socket Timeout
    • 연결된 커넥션이 데이터를 주고받지 않고 기다릴 수 있는 최대 시간
    • 느린 쿼리 또는 네트워크 문제 시 발생
  3. 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 연결 요청 없도록 설계
  • 장시간 실행되는 쿼리는 반드시 쿼리 튜닝 필요
  • 배치 시스템 등 커넥션 유지 시간이 긴 서비스는 별도 설정 권장

📘 공식 문서 참고

 

반응형