ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 커넥션풀(DBCP)이란?
    프로그래밍 기초 공부 2022. 10. 6. 22:51

    열세 번째로 포스팅하게 될 내용은 커넥션풀에 대한 내용입니다.

     

    [ 커넥션 비용 ]

    WAS와 DB 사이의 연결에는 많은 비용이 듬
    MySQL8.0을 기준으로 서버가 DB에 연결하기 위한 Connecting 비용이 가장 큰 비율을 차지
    -> 이를 보안하는 방법이 Connection Pool

     

    [ 커넥션풀DBCP이란 ]

    WAS(웹 컨테이너)가 실행 될 때 DB연결을 위해 미리 일정수의 connection 객체를 만들어 Pool에 담아 뒀다가
    사용자의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법

     

    [ 커넥션풀 사용이유 ]

    자바에서 DB에 직접 연결해서 처리하는 경우(JDBC) 드라이버(Driver)를 로드하고커넥션(connection) 객체를 받아와야 함 그러면 매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적이기 때문에 커넥션풀을 사용하여 효율적이기 사용

     

    [ 동작 과정 ]

    1. 사용자가 DB를 사용하기 위하여 Connection을 요청한다.
    2. Connection Pool에서 사용되지 않고 있는 Connection 객체를 제공한다.
    3. 사용자가 Connection 객체를 사용 완료하면 pool로 반환한다.

     

    [ 장점 ]

    • DB 접속 설정 객체를 미리 만들어 연결하여 메모리 상에 등록해 놓기 때문에 불필요한 작업(커넥션 생성, 삭제)이 사라지므로 클라이언트가 빠르게 DB에 접속이 가능
    • DB Connection 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈 방지가 가능
    • DB 접속 모듈을 공통화하여 DB 서버의 환경이 바뀔 경우 쉬운 유지 보수가 가능
    • 연결이 끝난 Connection을 재사용함으로써 새로 객체를 만드는 비용을 줄일 수 있음

     

    [ 특징 ]

    • 웹 컨테이너(WAS)가 실행되면서 connection 객체를 미리 pool에 생성해 둠
    • HTTP 요청에 따라 pool에서 connection객체를 가져다 쓰고 반환
    • 물리적인 데이터베이스 connection 부하를 줄이고 연결 관리
    • pool에 미리 connection이 생성되어 있기 때문에 connection을 생성하는 데 드는 요청 마다 연결 시간이 소비되지 않음
    • 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정
    • 동시 접속자가 많은 경우
      • 동시 접속 할 경우 pool에서 미리 생성 된 connection을 제공하고 없을 경우는 사용자는 connection이 반환될 때까지 번호순대로 대기상태로 기다림
      • WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간이 줄어들고, 반대로 커넥션 풀을 적게 설정하면 그 만큼 대기시간이 길어짐

     

    [ 커넥션 풀의 크기와 성능 ]

    • Connection을 사용하는 주체인 Thread의 개수보다 커넥션 풀의 크기가 크다면 사용되지 않고 남는 커넥션이 생겨 메모리의 낭비가 발생
    • MySQL의 공식레퍼런스에서는 600여 명의 유저를 대응하는데 15~20개의 커넥션 풀만으로도 충분하다고 언급
    • MySQL은 최대 연결 수를 무제한으로 설정한 뒤 부하 테스트를 진행하면서 최적화된 값을 찾는 것을 추천
    • DB와 WAS의 Context Switching 역시 한계가 있기 때문에 Thread Pool의 크기는 Conncetion Pool의 크기를 결정하는데 매우 중요

    • 커넥션 생성은 Commons DBCP에서 이루어짐
    • Commons DBCP는 PoolableConnection 타입의 커넥션을 생성, 생성한 커넥션에 ConnectionEventListener를 등록
    • ConnectionEventListener에는 애플리케이션이 사용한 커넥션을 풀로 반환하기 위해 JDBC 드라이버가 호출할 수 있는 콜백 메서드가 존재
    • 생성된 커넥션은 commons-pool의 addObject() 메서드로 커넥션 풀에 추가
    • 이때 commons-pool은 내부적으로 현재 시간을 담고 있는 타임스탬프와 추가된 커넥션의 레퍼런스를 한 쌍으로 하는 ObjectTimestampPair라는 자료구조를 생성
    • 이들을 후입선출 형태의 CursorableLinkedList로 관리

     

    [ 커넥션 개수 ]

    커넥션의 개수는 BasicDataSource 클래스의 다음 속성으로 지정가능

    속성 이름 설명
    initialSize BasicDataSource 클래스 생성 후 최초로 getConnection() 메서드를 호출할 때 커넥션 풀에 채워 넣을 커넥션 개수
    maxActive 동시에 사용할 수 있는 최대 커넥션 개수(기본값: 8)
    maxIdle 커넥션 풀에 반납할 때 최대로 유지될 수 있는 커넥션 개수(기본값: 8)
    minIdle 최소한으로 유지할 커넥션 개수(기본값: 0)

     

    커넥션 개수와 관련된 속성의 조건

    • maxActive >= initialSize
      maxActive = 10이고 initialSize = 20이라고 가정하면 최초에 커넥션을 생성할 때 initialSize 값이 최대 커넥션 개수인 maxActive 값보다 커서 논리적으로 오류가 있음
    • maxIdle >= minIdle
      maxIdle < minIdle로 설정할 수는 있지만 최솟값이 최댓값보다 커서 논리적으로 오류가 있음
    • maxActive = maxIdle
      •  maxActive = 10이고 maxIdle = 5라고 가정
      • 항상 커넥션을 동시에 5개는 사용하고 있는 상황에서 1개의 커넥션이 추가로 요청
      •  maxActive = 10이므로 1개의 추가 커넥션을 데이터베이스에 연결한 후 풀은 비즈니스 로직으로 커넥션을 전달
      • 이후 비즈니스 로직이 커넥션을 사용 후 풀에 반납할 경우, maxIdle=5에 영향을 받아 커넥션을 실제로 닫아버림
      • 일부 커넥션을 매번 생성했다 닫는 비용이 발생할 수 있음

    '프로그래밍 기초 공부' 카테고리의 다른 글

    Servlet이란?  (0) 2022.10.10
    HTML, CSS, JS란?  (0) 2022.10.09
    Spring이란?  (0) 2022.10.03
    Tomcat과 Nginx란?  (0) 2022.10.02
    프레임워크란?  (0) 2022.10.02
Designed by Tistory.