반응형

상황

  • spring boot 프로젝트에 MySQL을 연동

  • 두 대의 서버에 spring boot 애플리케이션 실행

  • 동시 접속자 200명 테스트 중 아래 에러 발생

    ### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBCsted exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
    ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested except.SQLNonTransientConnectionException: Could not create connection to database server.] with root cause
    java.lang.ArrayIndexOutOfBoundsException: Index 24 out of bounds for length 23
    

Spring Boot 프로젝트 상황 파악

  • datasource는 hikari DBCP 사용중
  • 설정은 디폴트 설정을 사용중 (default connection pool size는 10)
  • 두 대의 서버에서 띄울 경우 20개의 커넥션 연결 시도

MySQL 상황 파악

  • 설정된 connection size 파악을 위해 아래 명령 수행

    show variables like 'max_connections';
    
  • 하지만 Too many connections 오류 발생

    [2020-09-21 09:29:19] [08004][1040] Data source rejected establishment of connection,  message from server: "Too many connections".
    
  • spring boot 애플리케이션 모두 종료, MySQL 재시작 후 다시 위 명령 수행 → 커넥션 설정 151로 되어있음

해결

  • MySQL의 connection pool size를 500으로 충분히 증가

    set global max_connections=500;
    
  • Spring Boot의 connection pool size를 100으로 증가 후 두 대의 서버에서 실행

  • 위 오류 더이상 발생하지 않는 것 확인

  • 연결된 컨넥션 수가 200개 맞는지 확인 완료

    show status where `variable_name` = 'Threads_connected';
    

결론

  • 예상 동시 접속자를 파악하고 그에 맞는 MySQL connection pool size 설정 필요
  • MySQL connection pool size, 서버 대수 등 상황에 맞게 Spring Boot의 connection pool size 설정 필요
  • connection pool size을 적절하게 늘렸을 경우 동시 접속자가 많아졌을 때 응답 속도가 빨라지진 않지만, connection timeout이 발생할 확률이 줄어드는 효과를 볼 수 있음
반응형

+ Recent posts