JDBC Connection

하루·2025년 10월 13일

JAVA

목록 보기
2/8

JDBC Connection

Connection은 연결을 담당하는 객체이다.
과거에는 DriverManager를 사용해서 매번 하나의 Connection을 생성하도록 했다. 하지만, 최근에는 DriverManager가 아닌 DataSource를 사용하면서, 여러 개의 Connection을 담고 있는 Connection Pool을 생성해 하나씩 꺼내 쓰는 효율적인 방식으로 대체되고 있다.
그래도 기본인 DriverManager에서 사용되었던 Connection과, 그 대체가 불가피했던 비효율성을 본 후에, DataSource에서 사용되는 Connection을 순차적으로 살펴보겠다.

Driver Manger의 Connection

Driver Manager 시절에는 요청할 경우 application과 Database사이 하나의 connection을 만들었었다.

 @CallerSensitive
public static Connection getConnection(String url,
    String user, String password) throws SQLException {
    java.util.Properties info = new java.util.Properties();

    if (user != null) {
        info.put("user", user);
    }
    if (password != null) {
        info.put("password", password);
    }

    return (getConnection(url, info, Reflection.getCallerClass()));

위와 같이 구현되어 있는 getConnection을 사용해 하나의 connection을 생성할 수 있다.
자세한 코드를 살펴보면, getConnection 안에서 몇 번의 getConnection 호출 후에 connect 함수를 호출하며 실제 연결까지 담당한다.
그런데 Oracle에서 제공하는 실제 코드를 보면 200줄 + 여러 개 메소드 호출 → 대략 1000줄의 코드를 매 getConnection 호출마다 실행하게 된다. (또한, 코드 내용을 자세히 살펴보면 byte를 이용해 통신함을 알 수 있다.)
이러한 점들 때문에 한 번의 통신 과정에 너무 많은 시간이 소요된다.
그래서 등장한 것이 Connection Pool이고, 이를 사용 가능하게 한 것이 JDBC DataSource이다.

JDBC DataSource

DriverManager의 Connection과 DataSource의 Connection은 다르다.
DriverManager는 매번 Connection을 생성해야 하지만, DataSource에서는 대여반납의 개념으로 동작한다.

  • 대여: dataSource.getConnection()
    이 함수를 호출하면 새로운 연결을 생성하는 것이 아닌, Pool에서 꺼내온다. (매우 빠름)
    만약 pool에 사용 가능한 Connection이 없으면, DataSource의 설정(이전에 공부했던) 중 connection-timeout에 따라, 다른 connection이 반납될 때까지 대기하거나 예외를 발생시킨다.

  • 반납: connection.close()
    이 함수를 호출하면 연결을 완전히 끊는 것이 아닌, Pool에 반환한다. Connection의 상태가 변경되며, active → idle로 전환된다.

0개의 댓글