먼저, ConnectionPool
- 커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것이다. 즉, 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다.
- WAS는 데이터베이스 커넥션이 필요할 때 직접 커넥션을 생성하지 않고, ConnectionPool Container로부터 커넥션을 하나 건네받고, 사용을 마치면 반납한다. -> DB 연결을 열고 닫는 비용을 절약할 수 있다.
ConnectionPool 장점
- 미리 커넥션을 생성하여 저장하므로, 항상 연결을 열린 상태로 유지하기 때문에 커넥션이 필요한 시점에 생성하는 시간을 소비하지 않는다.
- 커넥션 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있다.
- 생성된 Connection을 계속 재사용하여 생성되는 커넥션의 수가 많지 않다.
ConnectionPool 동작원리 - HikariCP
- 가벼운 용량과 빠른 속도를 갖는 JDBC의 커넥션 풀 프레임워크
- springboot는 커넥션 풀을 관리하기 위해 HikariCP를 사용한다.
- HikariCP의 동작법을 통해 커넥션 풀이 다음과 같이 동작한다.
- Thread가 커넥션을 요청했을 때 유휴 커넥션이 존재한다면 해당 커넥션을 반환해준다.
- 만약 유휴 커넥션이 존재하지 않는다면, HandOffQueue를 Polling하면서 다른 Thread가 커넥션을 반납하기를 기다린다.
- 다른 Thread가 커넥션 풀에 커넥션을 반납하면 커넥션 풀은 HandOffQueue에 반납된 커넥션을 삽입하고, HandOffQueue를 Polling하던 Thread는 커넥션을 획득하게 된다.
ConnectionPool의 크기와 성능
- Thread 개수 < ConnectionPool 크기 -> 사용되지 않고 남는 커넥션이 생겨 메모리 낭비가 발생한다.
- WAS의 Thread의 개수 > DB의 Connection Pool의 개수 이어야 한다.
- 애플리케이션에 대한 모든 요청이 DB에 접근하는 것이 아니기 때문이다.
- MySQL 공식 레퍼런스에서 600여명 유저를 대응하는데 15~20개의 커넥션 풀만으로도 충분하다고 언급하고 있다.
- 실제 운영 환경에서의 성능 테스트를 진행해 시스템 환경에 최적화된 값을 찾아내는 게좋다.
참고
'개발 > Spring' 카테고리의 다른 글
Entity와 DTO (0) | 2023.08.02 |
---|---|
@Transactional 동작원리와 public method calls private method에서의 트랜잭션 적용 여부 (0) | 2023.08.02 |
연관관계 매핑된 Entity 생성하기 (0) | 2023.08.01 |
JPA OSIV(Open Session In View)와 성능 최적화 (0) | 2023.07.12 |
@Transactional, JPA dirty checking, readOnly=true 옵션 (0) | 2023.07.12 |
댓글