public int dao () throws Exception {
try {
.........
try {
.........
} catch (Exception e) {
throw new Exception(e);
throw new Exception(e);
} finally {
if (rs != null) {
rs.close(); // ! 이 부분에서 에러가 발생되면, 아래의 구문들은 실행되지 않는다.
if (rs != null) {
rs.close(); // ! 이 부분에서 에러가 발생되면, 아래의 구문들은 실행되지 않는다.
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
}
...
보통 JDBC 코딩을 하면서, 이런류의 코드를 많이 보아왔다.
하지만, 이 코드에는 중대한 결함이 있다.
예를 들어, rs.close(); 를 하는 도중에, 예외가 발생하면, 코드의 진행 절차가 상위 메소드로 넘어가 버린다.
그렇게 되면, 아래의 pstmt 와 conn 은 close() 되지 않고 그대로 남아 메모리 누수가 발생하게 되는 것이다.
이를 예방하는 올바른 방법의 코드를 보자.
} finally {
if (rs != null) {
if (rs != null) {
try { rs.close(); } catch (SQLException e) {}
}if (pstmt != null) {
try { pstmt.close(); } catch (SQLException e) {}
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) {}
}
}
위와 같이 종료가 되는 각 부분을 try ~ catch 구문으로 감싸줘야, 위에서 실패하더라도 나머지 부분들이 종료가
안전하게 진행될 수 있다.
단순하지만.. 그 때문에 놓치기 쉬운 부분에 간단한 수정을 함으로써 메모리 누수를 막을 수 있게 되었다.