요즘 보고 있는 책 Core EJB 책을 보다보니 Stream 을 닫는 부분이 잘못 나와있다.
(뭐, 이거 빼고는 아직은 읽기에 부담스럽지 않고 만족스럽다..)
어찌 했냐면,
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()를 한번 사용해 보시라.
(뭐, 이거 빼고는 아직은 읽기에 부담스럽지 않고 만족스럽다..)
어찌 했냐면,
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()를 한번 사용해 보시라.
덧글
JDBC관련 코딩 속도와 코딩량이 압도적으로 줄어들었습니다~~