SQL 처리시간 + 커넥션 생성 시간이 추가되기 때문에 응답 속도에 영향을 준다Connection Pool이라고 한다
커넥션풀 크기
- 커넥션풀의 크기가 커지면 활성 커넥션도 많아질테니 CPU 리소스 사용량이 많아진다
- 각 커넥션은 메모리를 점유하기 때문에 메모리부족으로 인해 데이터베이스 과부하 상태에 이를 수 있다. 메모리 누수 또는 OutofMemory같은 심각한 문제가 발생할 수 잇다
- 모든 커넥션이 활성화되면 데이터베이스도 많은 요청을 처리해야해서 성능저하나 접속 실패가 발생할 수 있다
- 참고: https://bugoverdose.github.io/docs/database-connection-pool-sizing/
HikariCP를 사용한다
동작원리
- Connection객체를 래핑한 PoolEntry로 Connection을 관리하고 이를 관리하는 ConcurrentBag이라는 구조체가 있다
HikariPool.getConnection() -> ConcurrentBag.borrow()을 통해 유휴 상태의 Connection을 반환한다- ConcurrentBag이 커넥션을 반환할 때 스레드의 정보를 확인하고 이전에 반환해준 스레드를 우선적으로 반환해주고 만약 해당 스레드가 일하고 있다면 유휴 스레드를 찾아서 반환해준다
- 커넥션 생성을 요청한 스레드의 정보를 저장해두고 다음에 접근 시 저장된 정보를 이용해 빠르게 반환해준다
- 트랜잭션이 종료(커밋, 롤백)이 되면
connection.close()가 호출되어 Pool에 반납한다
connection.close() -> concurrentBag.requite()이 실행되며 커넥션이 반납된다
HikariConfig을 통해 확인할 수 있다spring:
datasource:
url: 주소주소
username: root
password: Password
hikari:
maximum-pool-size: 100 #최대 pool 크기
minimum-idle: 10 #최소 pool 크기
idle-timeout: 600000 #연결위한 최대 유후 시간
max-lifetime: 1800000 #반납된 커넥션의 최대 수명
참고) https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole
https://techblog.woowahan.com/2664/