Connection pool과 HicariCP

Haechan Kim·2023년 9월 22일
0

Spring

목록 보기
51/69

https://code-lab1.tistory.com/209

서버가 디비에 연결할 때 커넥션 비용이 가장 크다

커넥션 풀은 디비와 연결된 커넥션 미리 만들고 이를 pool 처럼 관리하는 것

미리 디비와 연결시킨 상태 유지하는 기술.

쓸때만 가져다보기

미리 만들어둔 커넥션 이용하면 커넥션 비용 줄일 수 있음 → 빠른 디비 접속

커넥션 수 제한 가능 → 과도 접속 방지 가능.

Hikari CP란? (Hikari Connection Pool)

가볍고 빠른 jdbc 커넥션 풀 프레임워크

  1. 스레드의 커넥션 요청
  2. connection pool에서 이전 사용했던 커넥션 정보 존재 여부 확인 (풀에 있는지 확인)
  3. 이전 사용했던 목록 중 사용 가능한 존재 여부 확인
  4. 전체 커넥션 목록 중 사용 가능한 존재 여부 확인
  5. 2~4 순서대로 유휴 커넥션 (idel connection) 존재 시 바로 반

이 과정에서 유휴 커넥션 없으면 hadOffQueue를 polling 하면서 다르 스레드가 커넥션 반납하기 기다림

다른 애가 커넥션 반납하면 handOffQueue에 반납된 커넥션 삽입하고 handOffQueue를 pollling 하던 스레드는 커넥션 획득.

풀 크기 너무 작다면 커넥션 획득하려고 대기하는 스레드 많아짐

→ 해결하려면 풀 크기 늘리면 되는데 크기는 어느정도가 적당할까?

풀 크기가 너무 크다면, 즉 커넥션을 사용하는 스레드 수 보다 풀 크기가 더 크면

사용되지 않고 남는 커넥션 생겨 메모리 낭비 발생.

mysql 공식 레퍼런스는 600명의 유저에 대를해 15-20개의 커넥션 풀이 적당하다고 하고 있음.

mysql 최대 연결 수를 무제한으로 설정한 뒤 부하 테스트를 진행하면서 최적화 값을 찾자!


https://seolin.tistory.com/123

작업이 특정 시간마다 실행되게 설정되어 있는데 수행 속도가 그 시간을 넘기다면?

@EnabeScheduling → 스프링에서 스케줄러 사용 위한 어노테이션

주기적으로 실행해야 하는 메소드에 @Scheduled 어노테이션

fixedDelay vs fixedRate

@Scheduled(fixedDelay = 1000) {
public void ficedRateJob() {
// ...
//
}

fixedDelay는 해당 작업이 끝난 시점부터 시간 측정

fixedRate는 해당 작업 시작 시점부터 시간 측정

만약 fixedRate보다 작업 수행 시간이 더 길다면?

스케줄러 사용하기 - 스레드 풀

스프링의 스케줄러 기본 설정의 한계점 - 싱글 스레드

@Scheduled 작업이 여러개일때 꼬이는 상황 발생

→ 방지 위해서 스케주러가 멀티 스레딩으로 작동하게 만들 필요가 있음

기본 스케줄러의 풀 사이즈는 1.

스케줄링 설정에서 스레드 풀을 늘리자!

하지만 스레드 풀을 사용해도 스레드 하나에 task 하나 할당 됨.

같은 task 가 동시에 여러 스레드로 실행되지는 않음.

→ 비동기적으로 스케줄링을 수행하자!

SpringBootApplication에 @EnableAsync, 스케줄링 메소드에 @Async

0개의 댓글