https://code-lab1.tistory.com/209
서버가 디비에 연결할 때 커넥션 비용이 가장 크다
커넥션 풀은 디비와 연결된 커넥션 미리 만들고 이를 pool 처럼 관리하는 것
미리 디비와 연결시킨 상태 유지하는 기술.
쓸때만 가져다보기
미리 만들어둔 커넥션 이용하면 커넥션 비용 줄일 수 있음 → 빠른 디비 접속
커넥션 수 제한 가능 → 과도 접속 방지 가능.
Hikari CP란? (Hikari Connection Pool)
가볍고 빠른 jdbc 커넥션 풀 프레임워크
이 과정에서 유휴 커넥션 없으면 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