Connection Pool(커넥션 풀)
위키백과에 따르면..
소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다.
데이터베이스에 있는 정보를 가져오거나 수정 등등의 기능을 수행하기 위해서는 DB 커넥션 객체를 얻고, 이 객체를 사용하여 사용할 쿼리문을 수행한다.
간단한 예시로, 메모리 관리를 위해 쿼리문 수행 후 꼭 close() 메서드를 수행해주어야 하는데 프로그램 하나가 실행될 때 필요한 쿼리문이 한 개가 있는 것이 아니니 한 프로그램에서는 최소 한 번 이상의 연결이 연결되고, 끊어지게 될 것이다. 또한 한 개의 기능을 수행할 때도 데이터베이스와의 연결이 여러 번 요청되고 끊어질 수 있다.
이렇게 연결과 종료가 반복될 때마다 드라이브를 로드하고 Connection 객체를 생성하여 연결하고 종료하므로 비효율적이고, Connection에 드는 비용이 커지며 과부화가 발생할 수 있다.
다음은 코드 예시이다.
public List<BookDTO> readByUid(int uid) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<BookDTO> list = null;
try {
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(D.SQL_BOOK_INC_VIEWCNT);
pstmt.setInt(1, uid);
pstmt.executeUpdate();
pstmt.close();
pstmt = conn.prepareStatement(D.SQL_BOOK_SELECT_BY_UID);
pstmt.setInt(1, uid);
rs = pstmt.executeQuery();
list = buildList(rs); // ResultSet에 담긴 값을 List 타입으로
conn.commit();
} catch (SQLException e) {
conn.rollback();
throw e;
} finally {
close();
}
return list;
}
글 읽기 기능 수행을 위해 D.SQL_BOOK_INC_VIEWCNT(조회수 증가를 위한 UPDATE문)와 D.SQL_BOOK_SELECT_BY_UID(글 읽기를 위한 SELECT문) 두 개의 쿼리문을 실행한다.
이때 두 번째로 실행하는 쿼리문인 SELECT문을 사용하기 위해 이전에 설정했던 pstmt를 close()해주어야 한다. 이후 다시 pstmt 객체를 생성하여 데이터베이스와 연결하고, 쿼리문을 실행해 원하는 정보를 불러왔으면 close() 해준다.
이렇듯 하나의 기능을 수행할 때도 연결과 종료가 두 번 될 수 있는데, 매 기능을 수행할 때마다 계속 드라이버가 연결과 종료를 해주어야 한다면,, 😱
이러한 과정을 줄이기 위하여 Connection Pool을 사용한다.
이미 생성된 여러 개의 Connection을 Connection Pool에다 담아놓은 뒤, 사용자가 연결을 요청할 때 Connection Pool에 있는 Connection 객체를 제공해준다.
사용자가 사용을 끝마치면 기존에는 그냥 연결이 종료되는 것과는 다르게 Connection Pool로 사용한 Connection을 반납한다.
Connection Pool을 사용하면 서버의 부하를 줄여주고, 서버의 자원을 효율적으로 사용할 수 있다.
사용자가 데이터베이스에 있는 데이터를 요청할 때, 이전과는 달리 Connection연결 및 종료와 같은 불필요한 작업을 하지 않게 되기 때문이다. 이는 Connection을 재사용하는 것이기 때문에 새로운 객체를 생성하는 비용을 줄일 수 있다.
Commons DBCP
미리 생성되는 Connection의 개수는 DBCP(Database Connection Pool) 구현체를 제공하는 라이브러리를 통해 설정할 수 있다.
initialSize : BasicDataSource 클래스 생성 후 최초로 getConnection() 메서드를 호출할 때 커넥션 풀에 채워 넣을 Connection 개수
maxActive : 동시에 상요할 수 있는 최대 Connection 개수 (기본값 : 8)
maxIdle : Connection Pool에 반납할 때 최대로 유지될 수 있는 Connection 개수 (기본값 : 8)
minIdle : 최소한으로 유지할 Connection 개수 (기본값 : 0)