ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DBCP(Database Connection Pool)
    STUDY/DB 2023. 5. 17. 22:42

     

    DBCP란?

    웹 컨테이너(WAS)가 실행되면서 DB와 미리 일정 갯수의 connection(연결)을 만들어 pool에 저장해두었다가, 클라이언트 요청이 오면 connection을 제공하고고, 처리가 끝나면 pool에 다시 반환하여 보관하는 방식을 의미한다.

     

    DBCP를 사용하는 이유는 무엇일까?

     

    데이터베이스와 Connection을 맺는 작업은 매우 느리며 자원을 많이 소모하는, 비용이 큰 작업이다. 연결을 매번 생성하면 매 요청마다 연결 생성 비용이 발생하여 애플리케이션의 성능을 저하시킬 수 있고, 만약 다수의 사용자들이 동시다발적으로 데이터베이스의 Connection 연결을 요청한다면 최악의 경우 서버가 다운될 수 있다. 이러한 비용과 같은 문제들을 해결하기 위해 DBCP를 사용할 수 있다.

     

    • 여러 개의 DB Connection을 하나의 Pool에 모아놓고 관리
    • DB 커넥션 객체를 여러 개 생성한 뒤 Pool에 담아놓고 필요한 경우 불러와 사용
    • 만약, 빌려줄 수 있는 Connection이 존재하지 않는다면 Connection 객체가 반환할 때까지 클라이언트는 대기
    • 사용이 끝난 커넥션 객체는 다른 작업에서 다시 사용할 수 있도록 Pool에 반환

     

    DB 설정(MySQL)

    • max_connections : client와 맺을 수 있는 최대 connection 수

     

    max_connections 수를 4로 지정했을 때, DBCP의 최대 connection 수가 4인 경우를 살펴보면,

    하나의 애플리케이션만 존재한다면 connection을 연결하는데 문제가 없지만, 클라이언트 요청이 많아져서 애플리케이션 서버를 늘릴 경우, 이미 기존 애플리케이션에서 connection을 최대로 맺고 있기 때문에, 새로운 애플리케이션과의 연결이 불가능해진다.

     

    • wait_timeout : connection이 inactive할 때 다시 요청이 오기까지 얼마의 시간을 기다린 뒤에 close할 것인지를 결정

     

    애플리케이션쪽에서 connection 처리가 정상적으로 동작하지 않으면 DB 서버 입장에서 계속 연결된 상태로 인지해 연결을 종료하지 않고 하염없이 기다리는 상태가 된다. 이런 연결이 DB 서버에 여러 개 발생하면 DB 서버 성능 저하에 영향을 주기 때문에, wait_timeout을 설정해 마지막 요청으로 부터 일정시간 동안 요청이 없으면 연결을 종료하는 설정을 해야 한다.

     

    DBCP 설정(HikariCP)

    • minimumIdle : pool에서 유지하는 최소한의 idle connection 수
    • maximumPoolSize : pool이 가질 수 있는 최대 connection 수로, idle과 active(in-use) connection 합쳐서 최대 수

     

    idle connection 수가 minimumIdle보다 작고, 전체 connection 수도 maximumPoolSize보다 작다면 추가로 connection을 만든다. 예를 들어, minimumIdle이 2이고, maximumPoolSize가 4인 경우에, 클라이언트 요청으로 idle connection이 하나가 되는 경우, minumunIdle 설정인 2를 맞추기 위해 새로운 connection이 생성된다. 

    하지만 connection 수가 maximumPoolSize와 동일하고 idle connection이 minimumIdle보다 작은 경우에는, 이미 pool이 가질 수 있는 최대 connection 수와 동일하기 때문에, minumumIdle 수를 충족하지 않아도 새로운 connection이 생성되지 않는다. 이것은 maximumPoolSize가 minimumIdle 보다 우선순위가 높다는 것을 의미한다.

     

    minimumIdle의 기본 값는 maximumPoolSize와 동일한데, 보통 기본 값을 권장한다. 해당 설정은 pool size를 고정시키는 방법인데, 이것을 권장하는 이유는 minimumIdle을 maximumPoolSize보다 작게 설정하는 경우, 요청이 들어올 때마다 minimumIdle 을 충족시키기 위해 새로운 connection이 생성되고, connection이 만드는 속도가 오래 걸리기 때문에 요청이 몰려오는 경우 처리가 지연될 수 있기 때문이다.

     

    • maxLifetime : pool에서 connection의 최대 수명, maxLifetime을 넘기면 idle 상태인 경우 pool에서 바로 제거되고, active 상태인 경우 pool로 반환된 후 제거된다. 그리고 DB의 connection time limit보다 짧게 설정해야 한다.
    • connectionTimeout : pool에서 connection을 받기 위한 대기 시간

     

     

    Commons DBCP

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

     

     

    참고

    https://zzang9ha.tistory.com/376

    https://www.youtube.com/watch?v=zowzVqx3MQ4

     

     

    'STUDY > DB' 카테고리의 다른 글

    파티셔닝  (0) 2023.06.07
    RAC(Real Application Clusters)  (0) 2023.05.24
    Spring Transactional  (0) 2023.05.10
    Database Lock  (0) 2023.04.26
    Isolation Level  (0) 2023.04.25
Designed by Tistory.