커넥션 풀(Connection Pool)

Walter Mitty·2023년 1월 30일
0

커넥션 풀(DBCP)란,

웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection을 해놓은 객체들을 pool에 저장해두었다가, 클라이언트에서 요청이오면 connection한 객체를 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식이다.

커넥션 풀을 사용하는 이유는?

나는 아래와 같은 코드를 사용해왔는데 이 코드를 봐보자.

Connection conn = null;
PreparedStatement  pstmt = null;
ResultSet rs = null;

try {
    sql = "SELECT * FROM product"

    // 1. 드라이버 연결 DB 커넥션 객체를 얻음
    connection = DriverManager.getConnection(jdbcURL, username, password);

    // 2. 쿼리 수행을 위한 PreparedStatement 객체 생성
    pstmt = conn.createStatement();

    // 3. executeQuery: 쿼리 실행 후
    // ResultSet: DB 레코드 ResultSet에 객체에 담김
    rs = pstmt.executeQuery(sql);
    } catch (Exception e) {
    	e.printStackTrace();
    } finally {
        conn.close();
        pstmt.close();
        rs.close();
    }
}

원래는 java코드에서 DB에 직접 연결해서 처리하는 경우, 드라이버(Driver)를 로드하고 커넥션 객체를 받아와야 한다.
이게 왜 안좋다면 매번 사용자가 호출을 할 때마다 드라이버를 로드하고, 커넥션 객체를 생성하고, 연결하고, 종료하기 때문에 매우 비효율적이라고 할 수 있다.
이러한 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.

커넥션 풀의 특징으로는,

  • 물리적인 데이터베이스의 connection에서 오는 부하를 줄이고 연결을 관리한다.
  • pool에 미리 생성되어있기 때문에 connection을 생성하는 데 드는 요청마다의 연결 시간이 소비되지 않는다.
  • 커넥션은 재사용을 하기 때문에 생성되는 커넥션 수를 제한적으로 설정한다.

그럼 동시 접속자가 많을 경우엔?

동시 접속이 많을 경우 pool에 미리 생성해둔 connection을 제공하고 없을 경우 사용자는 사용중인 connection이 반납될 때까지 순서대로 대기상태가 되어 기다린다.

WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간이 죽어들고,
반대로 커넥션 풀을 적게 설정하면 그만큼 대기시간이 길어지게된다.

조건은,

  • DataSource를 상속받은 상태여야 한다!

0개의 댓글