| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- JPA
- docker
- Lv.0
- AWS
- 포트폴리오
- Kafka
- JMeter
- nginx
- LV01
- SQL
- 일정관리프로젝트
- Java
- 연습문제
- 일정관리 프로젝트
- CoffiesVol.02
- Redis
- 데이터 베이스
- LV02
- 프로그래머스
- LV.02
- spring boot
- LV0
- CI/CD
- 알고리즘
- 이것이 자바다
- mysql
- Join
- LV03
- 디자인 패턴
- 코테
- Today
- Total
코드 저장소.
커넥션 풀 본문
목차
1. DBCP?
2. DBCP의 작동방식
3. 설정 방법 및 예시
1. DBCP?
DBCP(Database Connection Pool)는 데이터베이스와의 연결(Connection)을 미리 여러 개 만들어 풀(Pool)에 보관해두고, 요청이 들어올 때마다 꺼내 쓰고 반납하는 방식입니다. 일반적으로 DB Connection을 하나 새로 만드는 데는 아래 과정이 필요합니다.
- TCP 소켓 연결
- DB 인증 (아이디/비밀번호 검증)
- 세션 생성
요청마다 이 과정을 반복하면 응답이 느려지고, 트래픽이 몰릴 경우 DB 서버가 버티지 못합니다. DBCP는 이 비용을 최소화하기 위해 등장했습니다.
2. DBCP의 작동방식
DBCP는 크게 4단계로 동작합니다.

서버 시작시 -> 설정한 개수만큼 Connection을 미리 생성해 Pool에 보관합니다.
요청이 들어오면 -> Pool에서 유휴 Connection을 꺼내 줍니다. (getConnection())
쿼리 실행후 -> Connection을 끊지 않고 Pool에 반납합니다.(close() -> 실제로는 반납)
Pool이 꽉 찼을 때 -> 반납될 때까지 요청을 대기시킵니다. 대기 시간 초과 시 예외를 발생합니다.
3. 설정 방법 및 예시
주요 설정값
| maxTotal | Pool이 가질 수 있는 최대 커넥션 수 | 8 ~ 20 |
| maxIdle | 유휴 상태로 유지할 최대 커넥션 수 | maxTotal의 절반 |
| minIdle | 항상 유지할 최소 커넥션 수 | 2 ~ 5 |
| maxWaitMillis | 커넥션 반납 대기 최대 시간 | 3000ms |
Spring Boot + HikariCP (권장)
Spring Boot는 기본적으로 HikariCP를 내장합니다. 별도 의존성 추가 없이 application.yml만 설정하면 됩니다.
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 1234
hikari:
maximum-pool-size: 10 # maxTotal
minimum-idle: 3 # minIdle
connection-timeout: 3000 # maxWaitMillis (ms)
idle-timeout: 600000 # 유휴 커넥션 유지 시간 (ms)
Apache Commons DBCP (레거시 프로젝트)
Spring Boot 이전 환경이나 레거시 프로젝트라면 Apache Commons DBCP를 직접 설정합니다.
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("1234");
dataSource.setMaxTotal(10); // 최대 커넥션 수
dataSource.setMaxIdle(5); // 유휴 상태 최대 수
dataSource.setMinIdle(2); // 최소 유지 수
dataSource.setMaxWaitMillis(3000); // 대기 최대 시간
Connection Leak 주의
커넥션을 빌려가고 반납하지 않으면 Pool이 고갈되어 장애로 이어집니다. 반드시 try-with-resources로 자동 반납을 보장해야 합니다.
// try-with-resources: 블록을 벗어나면 자동으로 반납됨
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ResultSet rs = ps.executeQuery();
// 결과 처리...
} // ← 여기서 자동으로 Pool에 반납
Pool 사이즈 튜닝 공식 (HikariCP 공식 권장)
CPU 코어 수 × 2 + 유효 디스크 수
무조건 크게 설정하면 오히려 DB 서버의 최대 허용 연결 수를 초과해 에러가 발생합니다.
한 줄 요약
매번 DB 연결을 새로 만들지 말고, 미리 만들어둔 연결을 빌려 쓰고 반납하자. 신규 프로젝트라면 HikariCP를 쓰고, maximum-pool-size부터 설정하면 됩니다.
'ComputerScience > DB' 카테고리의 다른 글
| With 구문 (0) | 2024.09.12 |
|---|---|
| 인덱스를 적용한 성능 개선 (0) | 2024.04.06 |
| [데이터 베이스] Lock 에 대해 알아보자. (0) | 2023.12.20 |
| MySql[MariaDB] join (0) | 2023.03.11 |
| [MySql] 조건문 (if,case문) (0) | 2023.03.01 |