본문 바로가기
JAVA & Spring/Error

[Spring][React] Failed to validate connection Possibly consider using a shorter maxLifetime value. 에러 해결 방법

by 알기 쉬운 코딩 사전 2025. 1. 25.
반응형

✅  참고

백엔드 프로젝트의 구성은 Spring 3.X 버전과 JPA로 구성되었으며,
프론트엔드 프로젝트는 React와 React Query(tanstack query) 등으로 구성되었습니다.

해당 에러 메시지를 정확하게 이해하려면 Spring의 SpringDB에 대한 이해와 JPA의 OSIV에 대한 정확한 이해가 필요합니다.
참고: SpringDB에 대한 이해는 JDBC와 JPA의 관계, Spring의 ConnectionPool입니다.

 

🚨 서버 실행 중 Spring Log에서 발생한 에러 메시지

com.zaxxer.hikari.pool.PoolBase - HikariPool-1 - Failed to validate connection
Possibly consider using a shorter maxLifetime value.

c.zaxxer.hikari.pool.ProxyConnection - HikariPool-1 - Connection 
marked as broken because of SQLSTATE(08000), ErrorCode(-1)
java.sql.SQLNonTransientConnectionException
java.net.SocketException: Connection reset by peer

org.hibernate.exception.JDBCConnectionException: JDBC exception executing SQL

에러 메시지 해석

1. Spring에서 ConnectionPool의 지속시간을 늘려보세요.

2. MySQL에서 DBConneciton 에러 발생

3. Spring에서 JDBC가 SQL을 실행하는 도중에 에러 발생

 

 에러 발생 이유

클라이언트 측에서는 5가지가 넘는 검색 조건이 SelectBox와 SearchBox로 존재하며,
이를 ReactQuery로 실시간으로 처리합니다.

백엔드에서는 해당 검색 조건을 입력받아 동적 쿼리로 검색 결과를 반환합니다.

해당 에러가 발생한 이유는 JPA의 OISV의 옵션이 지정되어 있지 않아서 발생한 문제입니다.

OSIV의 옵션을 설정하지 않으면, OSIV 옵션이 자동으로 활성화됩니다.
이는 DB connection의 생존 범위를 @Transactional이 아닌 @Controller 까지 확장하게 되버립니다.

즉, DB connection의 생존 범위가 확장되며 리소스 낭비가 이루어져,
실시간 검색 API에서 DB connection 자원이 부족하여 발생하게 된 에러 메시지입니다.

 

✅  해결 방법

Spring에서 JPA의 OSIV 옵션을 해제하고,
추가로 Spring에서 HikariCP 튜닝을 통해 적절한 커넥션 풀의 수를 관리해줍니다.

설정 방법은 아래 코드를 참고해주세요.

 

application.yml

수정 전 application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        default_batch_fetch_size: 100

 

수정 후 application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: com.mysql.jdbc.Driver
    hikari:
      connection-timeout: 30000  # 커넥션 타임아웃 설정 (ms)
      maximum-pool-size: 10  # 커넥션 풀의 최대 크기 설정
      minimum-idle: 5  # 유휴 커넥션을 유지할 최소한의 커넥션 수 설정
      idle-timeout: 600000  # 유휴 커넥션의 최대 유지 시간 설정 (ms)
      pool-name: MyHikariCP  # 커넥션 풀의 이름 설정
      validation-timeout: 5000  # 커넥션 유효성 검사 타임아웃 설정 (ms)
      auto-commit: true  # 자동 커밋 모드 설정
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        default_batch_fetch_size: 100
    open-in-view: false # osiv 옵션 해제

 

반응형

댓글