다재다능 개발자 성장기 🚀
커넥션 풀(Connection pooll) 본문
커넥션 풀이란?
데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것이다. 즉, 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다. 이처럼 미리 만들어 놓은 커넥션을 이용하면 서버와 DB를 연결하는데 필요한 비용을 줄일 수 있다. 따라서 DB에 빠르게 접속할 수 있다.
장점
- 커넥션 수를 제한하여 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있다.
- DB접속 모듈을 공통화해 DB 서버의 환경이 바뀔 경우 유지보수를 쉽게 할 수 있다.
- 연결이 끝난 Connection을 재사용함으로써 새로운 객체를 만드는 비용을 줄일 수 있다.
유의사항
1) 동시 접속자가 많을 경우
- 너무 많은 DB접근이 발생할 경우에는 커넥션은 한정되어 있기 때문에 쓸 수 있는 커넥션이 발납될 때까지 기다려야 함.
- 너무 많은 커넥션을 생성할 시에는 커넥션 또한 객체이므로 많은 메모리를 차지하게되고, 프로그램의 성능을 떨어뜨리는 원인이 된다.
- WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간이 줄어 들고, 반대로 커넥션 풀을 작게 설정하면 그 만큼 대기 시간이 길어지므로 사용량에 따라 적정략의 커넥션 객체를 생성해 두어야 함.
2) 커넥션 풀의 크기와 성능의 관계
커넥션을 사용하는 주체인 Thread의 개수보다 커넥션풀의 크기가 크다면 사용되지 않고 남는 커넥션이 생겨 메모리의 낭비가 발생하게 된다.
Hikari CP의 공식 문서에 의하면, 1 connections = ((core_count) * 2) + effective_spindle_count) 로 정의하고 있다.
HikariCP란?
HikariCP는 Brett Wooldridge 가 2012년 경 개발한 매우 가볍고 빠르고 안정적인 JDBC Connection Pool이다.
동작원리
Hikari CP가 동작하는 방식
- Thread가 Connection을 요청하면 Connection Pool의 각자의 방식에 따라 유휴 Connection을 찾아서 반환한다.
- Hikari CP의 경우, 이전에 사용했던 Connection이 존재하는지 확인하고, 이를 우선적으로 반환하는 특징이 있다.
- 가능한 Connection이 존재하지 않으면, HandOffQueue를 Polling하면서 다른 Thread가 Connection을 반납하기를 기다림.지정한 TimeOut 시간까지 대기하다가 시간이 만료되면 예외를 던진다.
* Polling 이란?
폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다.
- 최종적으로 사용한 Connection을 반납하면 Connection Pool이 Connetion 사용내역을 기록하고, HandOffQueue에 반납된 connection을 삽입
- 이를 통해 HandOffQueue를 Polling하던 Thread는 Connection을 획득하고 작업을 이어나간다.
참고
https://code-lab1.tistory.com/209
https://steady-coding.tistory.com/564
https://velog.io/@mstar228/Connection-Pool%EC%9D%B4%EB%9E%80
'TIL ⭐' 카테고리의 다른 글
Local에서 default branch 명을 master에서 main 으로 설정하기 (0) | 2022.12.30 |
---|---|
JWT (0) | 2022.12.06 |
쿠키와 세션 (0) | 2022.12.06 |
lodash 라이브러리( _.) (0) | 2022.08.14 |
NestJS 설치방법 (0) | 2022.08.10 |