DB

DBCP (Database Connection Pool)

shmallow 2023. 5. 17. 22:12

DBCP는 데이터베이스 연결 객체를 효율적으로 관리하기 위한 기술이다. 데이터베이스 연결은 생성하고 종료하는데 상당한 시간과 리소스가 필요하다. 따라서 웹이나 애플리케이션 서버에서 많은 수의 동시 사용자 요청을 처리해야 하는 경우, 각 요청마다 새로운 데이터베이스 연결을 생성하고 종료하는 것은 매우 비효율적이므로 해당 문제를 해결하기 위해 DBCP가 만들어졌다. 

DBCP는 미리 정해진 수의 데이터베이스 연결 객체를 생성해두고 관리하며, 요청이 들어올 때마다 이미 생성되어 있는 데이터베이스 연결 객체를 제공하고, 요청 처리가 완료되면 연결은 종료되지 않고 다시 반환되어 재사용되는 방식이다.

 

일반적으로 자바에서 DBCP를 사용하지 않고 직접 데이터베이스 연결을 생성하고 사용하는 과정은 아래와 같다.

1. 드라이버 로딩 : JDBC 드라이버를 메모리에 로드한다. (ex. Class.forName("com.mysql.jdbc.Driver"))

2. 연결 생성 : 위에서 로드한 드라이버를 통해 데이터베이스 Connection 객체를 생성한다. 

3. 쿼리 실행 및 결과 처리 : Statement 객체 생성 및 executeQuery 또는 executeUpdate를 통해 쿼리를 실행하고 필요한경우 ResultSet 객체를 반환해 처리한다.

4. 연결 종료 : Connection 객체의 close 메서드를 호출하여 데이터베이스 연결을 종료한다.

따라서 각 요청마다 새로운 연결을 생성하고 종료하는 것은 시간과 리소스가 많이 소모되므로 DBCP를 사용해 드라이버 로딩과 연결 생성 과정을 제거함으로써 데이터베이스 액세스 성능을 크게 향상시킬 수 있다.

DBCP

자바에서 사용하는 DBCP 라이브러리들은 대표적으로 Apache Commons DBCP, HikariCP 등이 있다. HikariCP는 다른 DBCP들 보다 빠른 성능을 보여 SpringBoot 2.0 이후 버전부터는 HikariCP가 채택되었는데 히카리 벤치마킹 페이지를 참고하면 월등한 성능을 보인다는 것을 알 수 있다.

HicariCP Options

HikariCP에서 사용할 수 있는 주요 옵션들에 대해 정리해보겠다.

1. connectionTimeout : 커넥션 풀에서 커넥션을 얻기 위해 대기할 수 있는 최대 시간을 의미한다. (default : 30초)

2. idleTimeout : 커넥션이 유휴 상태로 있을 수 있는 최대 시간을 의미한다. 해당 시간을 초과하면 커넥션은 종료된다. (default : 10분)

3. maxLifetime : 풀에서 유지할 수 있는 커넥션의 최대 수명을 의미한다. 해당 시간이 지나면 해당 커넥션을 풀에서 제거되고 새로운 커넥션이 생성된다. 하지만 maxLifetime 도중에 사용중인 커넥션은 강제로 종료하지 않고, 사용이 완료된 후에 제거된다. 주의할 점은 idleTimeout이 maxLifetime보다 길게 설정되면 idleTimeout이 되기전에 계속 재연결 해버리기 때문에 실제 커넥션들이 최소 갯수까지 떨어지지 않을것이다. (default : 30분)

4. maximunPoolSize : 풀의 최대 크기를 의미한다. hikariCP는 적절한 풀의 개수로 최소 (전체 Thread 수 * (Connection - 1) + 1) 를 권장하고 있다. (default: 10) 

5. minimunIdle : 풀이 유지해야 하는 최소한의 유휴 커넥션 개수를 의미한다. (default : maximumPoolSiz)

6. validationTimeout : 커넥션 유효성을 검사하기 위해 대기할 수 있는 최대시간을 의미한다. 즉, 유효성 검사 쿼리가 이 시간 내에 완료되지 않으면 해당 커넥션은 유효하지 않다고 판단한다. (default : 5초)

7. connectionTestQuery : 커넥션의 유효성을 판단하기 위해 실행할 SQL 쿼리를 지정한다. 이 쿼리는 커넥션 풀에서 커넥션을 가져오기 전에 실행되며, 쿼리가 성공적으로 실행되면 연결이 유효하다고 판단한다. JDBC4 부터는 해당 옵션없이도 유효성 검사를 할 수 있으므로 지양하고 있다.

8. keepAlive: HikariCP가 데이터베이스 또는 네트워크 인프라에 의해 시간 초과되는 것을 방지하기 위해 연결을 계속 유지하려고 시도하는 빈도를 제어한다. 이 값은 Idle Connection에 대해서만 유효하며 maxLifetime 값 보다 작아야 한다.

DBMS와 사용시 고려해야 할 부분

1. MYSQL

time_wait 옵션이 있는데, 이 부분은 클라이언트와 세션을 유지하는 최대 시간을 말한다. time_wait > maxLifetime으로 해주는게 좋다. maxILifeTime 마다 커넥션이 재연결되므로 time_wait도 초기화됨.

2. Oracle

IDLE_TIME:세션의 유휴 상태가 지속될 수 있는 시간을 지정. 예를 들어, IDLE_TIME이 30분으로 설정되어 있다면, 유저 세션이 30분 동안 활동이 없을 경우 해당 세션은 종료된다.

CONNECT_TIME: 세션이 유지될 수 있는 최대 시간을 지정. 예를 들어, CONNECT_TIME이 3시간으로 설정되어 있다면, 사용자 세션이 처음 연결된 후부터 3시간 후에는 연결이 종료된다. 

 

 

 

 

 

참조

https://velog.io/@songs4805/DBCP-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0

 

DBCP 간단히 정리하기

DBCP를 간단히 정리해보자.

velog.io

https://d2.naver.com/helloworld/5102792

https://github.com/brettwooldridge/HikariCP-benchmark

 

GitHub - brettwooldridge/HikariCP-benchmark: JHM benchmarks for JDBC Connection Pools

JHM benchmarks for JDBC Connection Pools. Contribute to brettwooldridge/HikariCP-benchmark development by creating an account on GitHub.

github.com

https://techblog.woowahan.com/2664/

 

HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그

{{item.name}} 안녕하세요! 공통시스템개발팀에서 메세지 플랫폼 개발을 하고 있는 이재훈입니다. 메세지 플랫폼 운영 장애를 바탕으로 HikariCP에서 Dead lock이 발생할 수 있는 case와 Dead lock을 회피할

techblog.woowahan.com

'DB' 카테고리의 다른 글

DB 테이블 파티셔닝  (0) 2023.06.07
Oracle RAC (Real Application Clusters)  (1) 2023.05.24
Database Lock, Isolation Level  (0) 2023.04.27
인덱스 스캔 종류  (0) 2023.04.12
Oracle 무작위 학습  (0) 2022.12.06