[3회차] Connection Pool, 어떻게 동작하고 어떻게 설정해야 할까? - DBCP와 HikariCP의 차이부터 적정 Pool 사이즈 공식까지 #32
Replies: 5 comments
-
|
Q1. Connection Pool 없이 매 요청마다 DB 연결을 새로 만든다면 어떤 과정을 거치게 될까요? 그 과정이 왜 비용이 크다고 할 수 있을까요? DB 연결을 새로 만들 때마다 TCP handshake + DB Session 을 생성 + memory에 socket 생성 등을 매 순간마다 해야하며, Q2. DBCP1에서 Thread A가 커넥션을 꺼내는 순간 나머지 Thread B, C가 대기 상태가 되는 이유는 무엇일까요? DBCP1에서 ThreadA가 커넥션을 꺼내는 순간 ConnectionPool 전체에 Lock이 걸리고 B, C는 대기 상태가 된다. Q3. HikariCP가 커넥션을 가져올 때 가장 먼저 ThreadLocal을 확인하는 이유는 무엇일까요? 캐싱을 위해서이다. HikariCP 내부의 ConcurrentBag은 커넥션을 빌릴 때 먼저 현재 스레드의 ThreadLocal 목록을 확인함. 즉, 지역 캐싱 + 가능성이 높은 빠른 경로 최적화이다. 다만 이는 보장이 아닌, 후보를 추려내는 과정이기 때문에 HikariCP의 커넥션은 여전히 풀 전체의 자원이고, ThreadLocal에 있는 커넥션이 항상 사용 가능한 것은 아니므로 상태를 CAS로 확인한 뒤 실패하면 공용 풀을 탐색하여 connection을 점유함. |
Beta Was this translation helpful? Give feedback.
-
Q1. Connection Pool 없이 매 요청마다 DB 연결을 새로 만든다면 어떤 과정을 거치게 될까요? 그 과정이 왜 비용이 크다고 할 수 있을까요?커넥션 풀이 없다면 매 연결마다 '네크워크 연결 -> DB 인증 -> DB 내부 리소스 할당 -> 쿼리 실행 및 결과 반환 -> 연결 종료' 과정이 필요합니다. Q2. DBCP1에서 Thread A가 커넥션을 꺼내는 순간 나머지 Thread B, C가 대기 상태가 되는 이유는 무엇일까요?DBCP1은 커넥션 풀을 관리할 때, 풀 전체에 대한 락을 걸었습니다. 그래서 스레드 A가 커넥션 풀을 사용하는 동안, B와 C는 A의 작업을 마칠 때까지 커넥션 풀을 사용할 수 없습니다. Q3. HikariCP가 커넥션을 가져올 때 가장 먼저 ThreadLocal을 확인하는 이유는 무엇일까요?스레드간 락 경합을 줄이기 위해서입니다. 커넥션을 사용하고 반납할 때 ThreadLocal로 캐싱을 하고, 다음에 커넥션이 또 필요할 때 캐시에 남아있던 커넥션을 우선으로 사용합니다. |
Beta Was this translation helpful? Give feedback.
-
|
Q1. Connection Pool 없이 매 요청마다 DB 연결을 새로 만든다면 어떤 과정을 거치게 될까요? 그 과정이 왜 비용이 크다고 할 수 있을까요? DB 연결의 경우 네트워크를 통해 연결하다보니 높은 비용이 발생합니다. SQL을 처리하기 위해 TCP 연결 생성 -> 인증 -> 세션 생성 -> 사용 후 연결 끊기 의 과정을 수행합니다. 실제 sql 수행보다 커넥션 생성 비용이 더 큰 경우가 많다보니 매번 커넥션을 생성하는 것은 비효율적입니다. Q2. DBCP1에서 Thread A가 커넥션을 꺼내는 순간 나머지 Thread B, C가 대기 상태가 되는 이유는 무엇일까요? 커넥션 풀 전체를 하나의 락으로 관리하기 때문에 A가 커넥션을 사용한다면 B, C는 대기 상태가 됩니다. Q3. HikariCP가 커넥션을 가져올 때 가장 먼저 ThreadLocal을 확인하는 이유는 무엇일까요? 쓰레드 로컬은 현재 쓰레드만 접근할 수 있는 본인만의 저장공간이라 락이 필요없고, 경쟁이 없습니다. 만약 이전에 사용한 커넥션을 사용하고 있는 쓰레드가 없다면 락 없이 즉시 커넥션을 획득할 수 있기 때문에 쓰레드 로컬을 가장 먼저 확인합니다. |
Beta Was this translation helpful? Give feedback.
-
Q1. Connection Pool 없이 매 요청마다 DB 연결을 새로 만든다면 어떤 과정을 거치게 될까요? 그 과정이 왜 비용이 크다고 할 수 있을까요?
과정을 매번 거치기 때문에 매 요청마다 DB와 새로운 연결을 생성해야 합니다. Q2. DBCP1에서 Thread A가 커넥션을 꺼내는 순간 나머지 Thread B, C가 대기 상태가 되는 이유는 무엇일까요?
Q3. HikariCP가 커넥션을 가져올 때 가장 먼저 ThreadLocal을 확인하는 이유는 무엇일까요?
|
Beta Was this translation helpful? Give feedback.
-
Q1. Connection Pool 없이 매 요청마다 DB 연결을 새로 만든다면 어떤 과정을 거치게 될까요? 그 과정이 왜 비용이 크다고 할 수 있을까요?요청이 들어올 때마다 새로운 DB 연결을 생성하면, 이 과정에서
이러한 네트워크 왕복과 인증 과정은 수 ms~수십 ms의 비용이 발생하며, 요청마다 반복되면 응답 시간이 증가하고 DB 서버에도 큰 부하를 주게 된다. Q2. DBCP1에서 Thread A가 커넥션을 꺼내는 순간 나머지 Thread B, C가 대기 상태가 되는 이유는 무엇일까요?여러 스레드가 동시에 풀의 상태(사용 가능한 커넥션 목록, 사용 중인 커넥션 수 등)를 수정하면 데이터가 깨질 수 있기 때문에 DBCP1은 synchronized로 한 번에 하나의 스레드만 접근하도록 설계되어있다. Q3. HikariCP가 커넥션을 가져올 때 가장 먼저 ThreadLocal을 확인하는 이유는 무엇일까요?HikariCP는 락 경쟁을 최소화하고 더 빠르게 커넥션을 획득하기 위해 먼저 ThreadLocal을 확인한다. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
🚀 발표 주제
Connection Pool, 어떻게 동작하고 어떻게 설정해야 할까? - DBCP와 HikariCP의 차이부터 Pool 사이즈 실험까지
📅 발표일
2026-06-15
🙋 발표자
로지
🗂️ 카테고리
💾 Database
📚 발표 자료
업로드 예정
🎥 발표 영상
업로드 예정
🎯 핵심 개념 요약
Connection Pool이란?
DB 연결을 매 요청마다 새로 만들지 않고, 미리 여러 개 만들어 풀에 보관해뒀다가 빌려주고 반납받아 재사용하는 기법이다. DB 연결 생성 과정(TCP 3-way handshake → DB 인증 → 세션 초기화)이 비싸기 때문에 필요하다.
DBCP1 → DBCP2 → HikariCP 발전 흐름
HikariCP ConcurrentBag 3단계 전략
커넥션을 가져올 때 아래 순서로 탐색한다.
적정 Pool 사이즈 공식
Pool 사이즈가 너무 크면 DB 서버에서 Context Switching이 증가해 오히려 성능이 저하된다.
🔗 미션과의 연결
방탈출 예약 대기 미션에서 다뤘던
예약 대기 자동 승격처럼 동시에 여러 요청이 들어올 때, Pool에서 커넥션을 어떻게 가져오는지가 실제 성능에 직결된다. 특히 maximumPoolSize를 기본값(10)보다 무작정 크게 설정하면 오히려 DB 서버에 부하가 생길 수 있다.📚 참고 자료
🙋♀️ 질문
Q1. Connection Pool 없이 매 요청마다 DB 연결을 새로 만든다면 어떤 과정을 거치게 될까요? 그 과정이 왜 비용이 크다고 할 수 있을까요?
Q2. DBCP1에서 Thread A가 커넥션을 꺼내는 순간 나머지 Thread B, C가 대기 상태가 되는 이유는 무엇일까요?
Q3. HikariCP가 커넥션을 가져올 때 가장 먼저 ThreadLocal을 확인하는 이유는 무엇일까요?
Beta Was this translation helpful? Give feedback.
All reactions