이전에 라이브러리는 제대로 안봤었다.
콘솔이나 오류메세지로 많이 봤던HikariCP 커넥션 풀
,hibernate
이 정확히 뭔지 알아봐야겠다.
목표!
HikariCP 커넥션 풀
,hibernate
동작 이해하기
서버가 DB에 연결하기 위한 Connecting 비용이 가장 큰 비율을 차지한다. 이를 보완할 수 있는 방법이 바로 Connection Pool이다
커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것으로 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다.
HikariCP는 가벼운 용량과 빠른 속도를 가지는 JDBC의 커넥션 풀 프레임워크이다.
SpringBoot는 커넥션 풀 관리를 위해 HikariCP를 사용한다.
Thread가 커넥션을 요청했을 때 유휴 커넥션이 존재한다면 해당 커넥션을 반환해준다.
유휴 커넥션이 존재하지 않는다면, HandOffQueue를 Polling 하면서 다른 Thread가 커넥션을 반납하기를 기다린다.
이러한 문제는 커넥션 풀의 크기를 늘려주면 해결할 수 있다.
그렇다면 커넥션 풀의 크기는 어느 정도인 게 좋을까?
🤔 커넥션 풀이 크면 클수록 좋을까?
Connection을 사용하는 주체인 Thread의 개수보다 커넥션 풀의 크기가 크다면 사용되지 않고 남는 커넥션이 생겨 메모리의 낭비가 발생하게 된다.
공식레퍼런스에서는 600여 명의 유저를 대응하는데 15~20개의 커넥션 풀만으로도 충분하다고 언급하고 있다.
MySQL은 최대 연결 수를 무제한으로 설정한 뒤 부하 테스트를 진행하면서 최적화된 값을 찾는 것을 추천한다.
우아한 형제들 테크 블로그에서는 다음과 같은 공식을 추천하고 있다.
Tn = 전체 Thread의 개수
Cm = 하나의 Task에서 동시에 필요한 Connection 수
DB와 WAS의 Context Switching 역시 한계가 있기 때문에 Thread Pool의 크기는 Conncetion Pool의 크기를 결정하는데 매우 중요하다.
위의 내용은 참고블로그를 보고 정리했다.
HikariCP
를 기억하는건 에러 메세지, 데드락 때문이다.