Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: [DB] DB Connection Pool #22

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

siyeonSon
Copy link
Member

개요

백엔드 개발을 하다보면 DB Connection Pool이 고갈되는 문제가 종종 발생하곤 합니다. DB Connection Pool의 개념과 동작방식에 대해 학습했습니다.

체크리스트

  • PR 제목을 Commit Convention에 맞게 작성
  • Label 추가
  • 리뷰어 팀 등록했나요?
  • Assignee 등록했나요?

@siyeonSon siyeonSon added the DB label Jan 5, 2025
@siyeonSon siyeonSon requested a review from a team January 5, 2025 02:41
@siyeonSon siyeonSon self-assigned this Jan 5, 2025
@siyeonSon siyeonSon requested review from JjungminLee, daeun084 and KkomSang and removed request for a team January 5, 2025 02:41
Copy link
Collaborator

@daeun084 daeun084 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개인적으로 더 공부해보고 싶은 주제였는데 자세하게 다뤄주셔서 흥미가 더 생기네요 :) 수고하셨습니다 ~~


### Hikari CP의 동작 방식
1. Thread가 Connection을 요청하면 Connection Pool의 각자의 방식에 따라 유휴 Connection을 찾아서 반환한다
- Hikari CP의 경우, 이전에 사용했던 Connection이 존재하는지 확인하고, 이를 우선적으로 반환한다
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

각 요청마다 사용했던 connection에 대한 로그가 남는건가요 ??

Copy link
Collaborator

@joojae02 joojae02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍


- 자바: 기본적으로 `DataSource` 인터페이스를 사용하여 커넥션 풀을 관리한다
- 스프링: SpringBoot 2.0 이전에는 tomcat-jdbc를 사용하다가 2.0 이후 부터는 Hikari CP를 기본 옵션으로 채택한다
- Hikari CP 성능이 월등히 좋다
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

무슨 차이 때문에 성능이 훨씬 좋은지 궁금하네요

![image](https://github.com/user-attachments/assets/51b8f94a-bb0c-416c-b837-a8657dc14168)

## 데드락 피하기
- 커넥션 풀을 크게 설정하면? → 메모리 소모가 큰 대신 많은 사람의 대기시간이 줄어 든다
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

역시 메모리는 다다익선..


### 커넥션 풀의 장점
- 커넥션 객체를 미리 만들어 연결하여 메모리 상에 등록해두기 때문에 클라이언트가 빠르게 DB에 접속할 수 있다
- DB 커넥션 수를 제한함으로써 과도한 접속을 방지할 수 있다
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약에 커넥션 풀에 못들어가면 어떻게 되는건가요?_?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

슬퍼요

validation-timeout: 3000
minimum-idle: 5
max-lifetime: 240000
maximum-pool-size: 20
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

보통 배포했을때도 풀 사이즈를 하드코딩하나요? 앞에서 보여주셨던 PoolSize = Tn × ( Cm - 1 ) + ( Tn / 2 ) --> 이 수식에 근거한 코딩을 사용하기도 하나요?!

Copy link
Member

@JjungminLee JjungminLee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

얼마전에 스레드풀에 대한 글을 읽다가 커넥션 풀에 대한 글을 맛보기로 봤는데 바로 이런 유익한 글을 올려주시다니..! 재밌게 봤습니당 😆

Copy link
Contributor

@KkomSang KkomSang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앞으로 property 정의를 할 때 도움이 많이 될 것 같습니다! 수고하셨습니다!!


### Hikari CP의 동작 방식
1. Thread가 Connection을 요청하면 Connection Pool의 각자의 방식에 따라 유휴 Connection을 찾아서 반환한다
- Hikari CP의 경우, 이전에 사용했던 Connection이 존재하는지 확인하고, 이를 우선적으로 반환한다
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이전에 사용했던 connection을 우선적으로 반환하는 것 또한 시간 절약이나 성능 향상을 위함인가요?!


![image](https://github.com/user-attachments/assets/3ccc54a0-de34-4bb1-a375-bd8bc8508972)

2. 가능한 Connection이 존재하지 않으면, HandOffQueue를 Polling하면서 다른 Thread가 Connection을 반납하기를 기다린다. 만약 TimeOut 시간이 만료되면 예외를 던진다
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

timeout이 된다면 최종적으로 해당 요청은 DB에 연결되지 못하는 걸까요?? timeout 이후 재시도와 같은 추가적인 동작은 없는건지 궁금합니다!

### 데이터베이스 커넥션 풀의 동작 방식
1. 애플리케이션 서버가 시작될 때 일정 수의 커넥션을 미리 생성한다
2. 애플리케이션 요청에 따라 생성된 커넥션 객체를 전달한다
3. 일정 수 이상의 커넥션이 사용되면 새로운 커넥션을 만든다

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

커넥션 풀의 커넥션 수는 상수 값이 아니라 서버 상황에 맞춰서 동적으로 변경 되는건가요?


### 커넥션 풀의 장점
- 커넥션 객체를 미리 만들어 연결하여 메모리 상에 등록해두기 때문에 클라이언트가 빠르게 DB에 접속할 수 있다
- DB 커넥션 수를 제한함으로써 과도한 접속을 방지할 수 있다

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

슬퍼요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants