try {
...
} catch(..) {
...
} finally {
if (writer != null) writer.close();
if (reader != null) reader.close();
if (socket != null) socket.close();
}
보통 위와 같이 했는데, 이렇게 하면 안된다.
위와 같이하면 첫번째 writer.close() 에서 예외가 발생하면 그 이후의 다른 close() 문들은 전혀 실행되지 않고 빠져나가 버려 리소스 누수가 발생하게 된다.
이것은 스트림이나 소켓 뿐만 아니라 JDBC Connection 에서도 마찬가지 이다.
그러므로 다음과 같이 바꿔야만 쓰겠다.
try {
...
} catch(..) {
...
} finally {
if (writer != null) {
try { writer.close(); } catch (Exception ex) {}
}
if (reader != null) {
try { reader.close(); } catch (Exception ex) {}
}
if (socket != null) {
try { socket.close(); } catch (Exception ex) {}
}
}
if / for / while 문 등은 비록 실행할 문장이 한 개 뿐이라도 괄호를 치는 것을 원칙으로 한다.
그리고 일일이 귀찮더라도 다 try/catch 안에 .close() 문을 넣어야 안전하게 리소스를 닫는 것이 된다.
Jakarta Commons DBUtils에는 저런 귀찮은 try/catch 없이 메소드 하나 호출로 JDBC 리소스를 닫아주는 메소드가 있다.
DbUtils.closeQuietly()를 한번 참고해 보시길....
'프로그램 > Java & Jsp' 카테고리의 다른 글
[펌] - Database별 셋팅 (0) | 2009.03.30 |
---|---|
[펌] - 큰 숫자의 처리를 위한 자바 타입 (0) | 2009.03.30 |
DB에 저장되어 있는 글의 enter 값을 <br>태그로 변환 (0) | 2008.12.29 |
JSP에서 session 사용법 (0) | 2008.12.29 |
[펌] - session 객체 (0) | 2008.12.29 |