JDBC(Java Database Connectivity)
JDBC란?
- 자바로 데이터베이스 접속을 할 수 있도록 해주는 자바 API이다.
- 썬 마이크로시스템즈는 1997년 2월 19일 JDBC를 JDK 1.1의 일부로 출시하였다. 그 뒤로 이제까지 자바 SE의 일부로 포함되고 있다.
- JDBC는 인터페이스이다. 데이터베이스 회사들은 JDBC 인터페이스를 구현한 드라이버를 제공한다.
- JDBC 드라이버는 각 밴드사에서 jar 파일로 제공된다.
JDBC 프로그래밍 순서
- JDBC 드라이버를 로딩한다.
- Connection 객체를 생성한다.
- PreparedStatement(Statement) 객체를 생성하고 SQL를 수행한다.
- SQL 문에 대한 결과물이 있다면 ResultSet 객체를 생성한다.
- 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-를-사용하자