한동안 DB에 커넥션에러가 발생했어서 maximum-pool-size를 설정주었는데
minimum-idle 셋팅도 있어서 같이 셋팅해주었었다.
spring:
datasource:
hikari:
...
minimum-idle: 5
maximum-pool-size: 10
그런데..... 처음보는 에러가 발생했다
HikariPool-1 - Connection is not available, request timed out after 45005ms.
오잉???? 이상하네
이 서버는 처음띄우는 서버가 아니라 이전에도 계속 돌아가고있었던 서버고,
사실 커넥션 에러가 날거였으면 요청이 더 많았을 때 에러가 났어야했는데..
지금은 요청이 상대적으로 적은편인데 에러가 나서 의아해했다
여러가지 이유가 있었겠지만
단편적으로 변경된 것은 두개 셋팅이 추가된 것이였다.
그래서 찾아보니...
This property controls the minimum number of idle connections that HikariCP tries to maintain in the pool. If the idle connections dip below this value and total connections in the pool are less than maximumPoolSize, HikariCP will make the best effort to add additional connections quickly and efficiently. However, for higher performance and response, is recommend not set this value instead allow HikariCP to act as a fixed size connection pool.
minimum-idle은 기본적으로 maximum-pool-size와 동일한 값으로 설정되는데,
최적의 성능과 응답성을 요구한다면 설정하지 않는 것이 좋다고한다.
처음엔 왜 그런가 싶었는데 간단히 예상할 수 있는 문제였다.
(설정 안함을 권장하는거면 왜 셋팅할 수 있게 해둔거야?!?!)
예를들어 생각해보자.
minimum으로 셋팅된 5개 커넥션이 모두 사용중이다.
추가적으로 커넥션을 1개 사용해야하니 커넥션을 새로 만든다
처리완료
일정시간이 지나자 추가로 만든 커넥션이 필요 없을 것 같다. 커넥션 해제!
...
갑자기 요청이 급증해 커넥션이 4개가 추가로 필요하다
커넥션을 또 4개 새로 만든다
커넥션 만들때까지 처리해야할 작업은 대기한다..
근데 이러면..
커넥션풀을 사용하는 의미가 없지 않나?! (머쓱)
나는 트래픽에 따라 커넥션이 유동적으로 움직이면
낭비되는 커넥션 없이 DB를 효과적으로 쓸 수 있을거라 생각했었는데
잘못된 생각이였다 😅
새로운 연결을 맺을때까지 시간이 소요되기 때문에 고정적인 성능을 낼 수 없으니
낭비되는 커넥션 자원이 있더라도 minimum과 maximum의 사이즈를 고정시키는게 더 좋다고한다!
참고
https://javabom.tistory.com/101
https://netmarble.engineering/hikaricp-options-optimization-for-game-server
'Backend' 카테고리의 다른 글
인덱스(1) : 인덱스를 사용하는 이유, 인덱스의 정의, 인덱스에 저장되는 데이터 (0) | 2024.07.17 |
---|---|
[SpringBoot] UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 해결후기 (6) | 2022.12.06 |
[SpringBoot] Apache Poi를 이용한 엑셀다운로드는 SXSSF를 쓰자..! (0) | 2022.12.03 |
Spring Jpa SelfJoin 순환참조 방지하며 다른 엔티티와 맵핑하기 (2) | 2022.11.09 |
Server-Sent Event (SSE)란? feat Node.js (0) | 2022.09.20 |