JDBC(Java Database Connectivity)

JDBC란?

  • 자바로 데이터베이스 접속을 할 수 있도록 해주는 자바 API이다.
  • 썬 마이크로시스템즈는 1997년 2월 19일 JDBC를 JDK 1.1의 일부로 출시하였다. 그 뒤로 이제까지 자바 SE의 일부로 포함되고 있다.

jdbc

  • JDBC는 인터페이스이다. 데이터베이스 회사들은 JDBC 인터페이스를 구현한 드라이버를 제공한다.
  • JDBC 드라이버는 각 밴드사에서 jar 파일로 제공된다.

JDBC 프로그래밍 순서

  1. JDBC 드라이버를 로딩한다.
  2. Connection 객체를 생성한다.
  3. PreparedStatement(Statement) 객체를 생성하고 SQL를 수행한다.
  4. SQL 문에 대한 결과물이 있다면 ResultSet 객체를 생성한다.
  5. Connection, PreparedStatement(Statement), ResultSet 객체를 close 한다.

Connection, PreparedStatement, ResultSet 객체 close

  • Connection, PreparedStatement(Statement), ResultSet 객체를 확실하게 close 해줘야한다. 그러지 않을 경우 리소스 풀이 바닥나서 시스템이 멈출 수 있다.

  • 실제로 이 문제로 미국의 모 대형항공사의 예약시스템이 3시간 동안 멈췄다.

어떻게 3가지 객체를 확실하게 close 해줄 수 있을까?

finally 구문 사용

public class Class1 {
    public method1() throws Exception {
            
      Connection conn = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      
      try {
          // ...
          conn = ...;
          ps = ...;
          rs = ...;
          
          // ...
      } catch (Exception e) {
          // ...
      } finally {
          if (rs != null) try { rs.close(); } catch(Exception e) {}
          if (ps != null) try { ps.close(); } catch(Exception e) {}
          if (conn != null) try { conn.close(); } catch(Exception e) {}
      }
    
    }
}

try-with-resources 구문 사용 (Java 7부터)

  • try 블록의 소괄호 () 안에서 close() 메서드 호출이 필요한 (AutoCloseable 를 구현한) 객체를 할당해 주면 된다.
public class Class1 {
    public method1() throws Exception {
      try (Connection conn = DriverManager.getConnection("...");
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery("SELECT 1 from dual")) {
          
          // ...
      } catch (Exception e) {
          // ...
      } 
    }
}

향상된 try-with-resources 구문 사용 (Java 9부터)

  • Java 9 부터는 try-with-resources 를 좀 더 유연하게 사용할 수 있게 되어서 try 블록의 밖에서 선언된 객체를 참조할 수 있다.
public class Class1 {
    public method1() throws Exception {
      Connection conn = DriverManager.getConnection("...");
      Statement stat = conn.createStatement();
      ResultSet rs = stat.executeQuery("SELECT 1 from dual")

      try (conn; stat; rs) {
          // ...
      } catch (Exception e) {
          // ...
      } 
    }
}

참고

  • https://gmlwjd9405.github.io/2018/06/03/agile-tdd.html
  • https://blog.benelog.net/1898928.html

  • https://hyoj.github.io/blog/java/basic/jdbc/jdbc-try-catch-tip.html#java-7-부터는-try-with-resources-를-사용하자

태그:

카테고리:

업데이트: