반응형
상황
-
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이 발생할 확률이 줄어드는 효과를 볼 수 있음
반응형
'Development > Experiment' 카테고리의 다른 글
[Experiment] X-Forwarded-For, X-Real-IP (1) | 2021.03.23 |
---|---|
[Experiment] 커넥션 과다 생성 테스트(open files) (0) | 2020.12.30 |
[Experiment] 스레드 과다 생성 테스트(max user processes) (0) | 2020.12.30 |