JDBC와 DBCP

신광진·2021년 3월 18일
0

JDBC


JDBCJava DataBase Conectivity 로써 자바에서 데이터베이스에 접근하고, SQL을 실행하기 위한 API입니다.

JDBC를 사용하기 위해서는 JDBC Driver를 메모리에 로드하고, DriverManager 를 이용하여 Connection 객체를 생성해야 합니다.

그 후 Query를 작성하고 생성된 Connection객체로 Statement 객체를 생성하여 Query를 수행합니다.

Insert, Update, Delete와 같은 명령어는 실행결과로 변경된 레코드 수를 반환하지만 Select와 같이 데이터베이스로부터 raw Data를 받아오는 경우는 ResultSet을 통해 결과를 받고, ResultSet에서 데이터를 추출하여 가공해서 사용합니다.

모든 작업이 끝나면 사용했던 자원을 모두 반환합니다.

위 작업을 간단한 예시 코드로 작성하면 아래와 같습니다.

Class.forName("DriverClassName");
Connection conn = DriverManager.getConnection(url, user, password)
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM TB_TABLE";
ResultSet rs = stmt.executeQuery(sql);

conn.close();
stmt.close();
rs.close();

여기서 생각해볼 점은 데이터베이스에 접근할 위와같은 작업을 수행해야 하는지입니다.

드라이버를 로딩하는 것은 프로그램을 실행할 때 한번만 하면되는 작업입니다.

하지만 데이터베이스의 자원은 한정되어 있기 때문에 사용한 후에는 반드시 반환해야합니다.

즉, 데이터베이스에 접근할 때마다 연결을 수립하고 끊는 작업이 반복적으로 이루어져야 하는데 Connection을 생성하는 작업은 network latency time을 발생시킵니다.

만약 다수의 사용자가 빠른주기로 데이터베이스에 접근해야하는 작업을 요청한다면 어떻게 될까요?

생성된 Connection객체가 반환되기도전에 새로운 Connection객체가 계속해서 만들어지는 상황이 발생하게되고, 결국 자원이 고갈되버립니다.

결과적으로 위의 작업을 반복수행함으로써 나타나는 문제는 자원의고갈과 지연시간발생입니다.

이를 쉽게말하면 데이터베이스가 다운되거나 애플리케이션의 포퍼먼스가 안좋아진다는 것입니다.

이러한 문제를 해결할 수 있는 방법은 DBCP 를 사용하는 것입니다.

DBCP


DBCPDataBase Connection Pool 로써 Thread pool 과 유사한 개념입니다.

JDBC 의 경우는 데이터베이스에 접근할 때마다 연결을 수립하고 자원을 반환해야 하는 작업을 반복했습니다.

하지만 DBCP를 이용하면 애플리케이션이 실행되는 시점에 미리 Connection객체를 일정개수 생성해놓고 요청이 들어올때마다 Connection Pool에서 Connection객체를 꺼내서 사용하고 다시 반환하는 방식으로 작업을 수행합니다.

서비스 규모에따라 처음에 생성되는 Connection객체의 개수를 조절할 수 있고, 사용자 수가 갑자기 증가하더라도 데이터베이스가 다운되지 않도록 최대 Connection생성 개수를 제한할 수도 있습니다.

DBCP를 사용할 때는 DataSource 객체를 사용하는데 JDBC를 통해 제공됩니다.

하지만 데이터베이스별로 JDBC가 다르고, 특정 JDBC를 통해 제공되는 DataSource를 사용하게 되면 사용하는 데이터베이스의 종류가 변경될 때 마다 소스코드를 변경해야하는 문제점이 생깁니다.

그래서 특정 데이터베이스에 종속적인 소스코드를 작성하지 않기위해 오픈소스 커넥션 풀 라이브러리인 Commons DBCP를 많이 사용합니다.

profile
이거 왜안되냐

0개의 댓글