본문 바로가기

Server Development/DataBase

DBCP

 

 

DBCP = Database Connection Pool

이번 블로그에서는 DBCP에 대해서 정리해보고자 한다.

 

 

 

1. 기존의 애플리케이션과 DB간 통신 방법

  • 클라이언트가 API 요청
  • 애플리케이션과 DB 간에 TCP 신뢰성 연결
  • 응답을 위해 DB에 리소스 요청
  • 리소스 응답
  • 애플리케이션과 DB 간에 TCP 신뢰성 해제
  • 클라이언트에 전달

- 항상 리소스를 받기위해 DB와 TCP 기반의 신뢰성 있는 통신을 하는데 연결할때는 3웨이 핸드셰이크, 연결해제시에는 4웨이 핸드셰이크가 매번 발생하고 이는 시간적으로 비효율적이다.

 

 

2. DBCP 동작 방식

- 위의 시간 낭비를 해결하기 위해 사용

- TCP 기반의 DB 커넥션을 미리 만들어 두고 사용함으로 TCP 연결 생성 및 해제 시간 단축

  • 애플리케이션 시작전에 TCP 기반의 여러 DB 커넥션을 생성
  • 여러 DB 커넥션을 담는 풀 생성
  • API 요청시마다 만들어놓은 DB 커넥션을 이용해 리소스 요청
  • DB 커넥션 사용 후 DB 풀에 반납

 

 

3. DBCP 사용

- 현재 배경은 SpringBoot와 MySQL을 기준으로 DBCP를 설정해보려고 한다.

 

 

의존성 설정

- 기본적으로 스프링 부트 2.0 이후 버전에서부터는 보통 Hikari CP 라는 커넥션 풀을 사용하는데 명시적으로 설정해 줄 필요없이 아래와 같이 설정시 사용 가능하다.

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

 

Config 설정

@Configuration
public class DatabaseConfig {

	@Bean
    DataSource dataSource(DataSourceProperties dataSourceProperties) {
        return DataSourceBuilder
                .create()
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword())
                .driverClassName(dataSourceProperties.getDriverClassName())
                .build();
    }
}

 

 

 

DB 서버 설정

 

1. max_connections

- DB가 클라이언트와 맺을 수 있는 최대 커넥션 수를 의미하며, 스케일 아웃 등을 고려해서 설정해야 한다.

- 예를 들어, 트래픽 증가로 애플리케이션 스케일 아웃 처리시 DB 커넥션 수가 부족하면 연결이 불가능해진다.

 

2. wait_timeout

- 커넥션이 inactive 상태에서 기다리는 시간을 제한해 무의미한 커넥션이나 오류 등을 방지한다.

- 한번 사용할때마다 0초로 초기화 된다.

 

 

 

Application 설정

 

- DBCP 설정을 의미

 

1. minimumIdle 

- pool에서 유지하는 최소한의 idle 커넥션 수, 최소한으로 유지할 사용되지 않는 커넥션 수

 

2. maximumPoolSize

- pool이 가질 수 있는 최대 커넥션 수, idle 커넥션 + active 커넥션

 

 

예시 : minimumIdle 은 3이고, maximumPoolSize은 5인 경우

- 요청 1 : 하나의 커넥션 사용시 Idle 커넥션 하나 더 생성된다 : idle 3, active 1

- 요청 2 : 하나의 커넥션 사용시 Idle 커넥션 하나 더 생성된다. : idle 3, active 2

- 요청 3 : maximum이 5이기 때문에 더이상 Idle 커넥션이 추가되지 않는다.

- 모두 응답한 경우 : 다시 idle 2, active 0 인 상태로 돌아온다.

 

보통은 minimumIdle값과 maximumPoolSize 값을 동일하게 설정한다. 매번 새로 추가,해제마다 TCP 연결이 필요하기 때문에 값을 같게 설정하는 것을 권장한다고 한다.

 

 

3. maxLifeTime

- 커넥션의 최대 수명을 의미하며 해제 후 maximumPoolSize에 맞추어 다시 생성

- Idle인 경우는 바로 반환, active한 경우에는 작업 종료 후 반환

- active한 상태에서 버그 등의 이유로 pool로 돌아오지 않는 경우에는 문제 발생하니 잘 반환을 해야한다.

- DB의 wait_timeout시간보다 2~5초 정도 짧게 설정한다. 이유는 커넥션을 사용 중 종료가 될 수 있기 때문이다.

 

4. connectionTimeout

- pool에서 connection을 받기 위한 대기 시간

- 요청이 해당 시간안에 커넥션을 못받으면 오류 처리

- 클라이언트가 기다리는 시간임을 고려해서 설정

 

 

 

 

연결을 잘했다면 아래와 같이 표시된다.

c.z.hikari.HikariDataSource HikariPool-1 - Starting...
...
c.z.hikari.HikariDataSource HikariPool-1 - Start completed.

 

 

 

4. 적절한 Connection 수 찾기

모니터링 환경 구축을 통한 관찰

벡엔드 시스템 부하 테스트를 통한 관찰 (ex : nGrinder)

- request per second : 단위 초당 몇개의 요청이 처리한가

- avg response time : 평균 응답 시간

- 그래프를 확인해 꺾이는 위치를 확인하여 튜닝

 

 

 

'Server Development > DataBase' 카테고리의 다른 글

REAL MYSQL 정리  (1) 2023.10.21