Java 리소스 닫기(Resource Close)를 제대로 하려면..

요즘 보고 있는 책 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()를 한번 사용해 보시라.

by 권남 | 2005/05/29 23:10 | 프로그래밍 | 트랙백(2) | 덧글(2)

트랙백 주소 : http://kwon37xi.egloos.com/tb/1373280
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 자바 및 오픈소스 at 2005/08/09 10:30

제목 : [그리고]Java 리소스 닫기(Resource Cl..
TONG하고 통했네요!!...more

Tracked from violetghk님의 .. at 2005/10/20 13:53

제목 : 리소스 잡기
<FONT ...more

Commented by RedBaron at 2005/06/10 14:31
DBUtils.closeQuietly() 넘 좋아욤 ㅠ_ㅠ
Commented by 권남 at 2005/06/10 15:06
그렇죠? 저두 DbUtils 너무 편하게 사용하고 있습니다.
JDBC관련 코딩 속도와 코딩량이 압도적으로 줄어들었습니다~~

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶