여기저기 블로깅 하면서 많이 듣고, 많이 보던 얘기인데, 좋은 방법을 하나 찾은거같다.

 DbUtils.closeQuietly() 이 메소드를 쓰니까 한방에 되네!

완전 굿인듯 ㅋㅋ 맨날 클로즈 메소드를 만든것도 귀찮았는데.. 




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()를 한번 사용해 보시라.
 
 


출처 : http://kwon37xi.egloos.com/
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


ResultSet 클래스

쿼리문이 실행되어 결과로 반환된 데이터들을 관리하는 ResultSet 클래스에 대해 알아 볼께요^^


absolute(int row)  ResultSet 객체의 특정한 행으로 이동합니다.
afterLast()  ResultSet 객체의 가장 마지막 행으로 이동합니다.
beforeFirst()  ResultSet 객체의 가장 처음 행으로 이동합니다.
close()  ResultSet 객체를 제거합니다.
findColumn(String colunmName)  컬럼의 이름이 ReseltSet 객체의 몇 번째 열에 존재하는지에 대한 위치 값을 얻어옵니다.
 getBoolean()  처리하고자 하는 데이터를 boolean 형태로 변환해서 가져옵니다.
 getByte()  처리하고자 하는 데이터를 Byte 형태로 반환해서 가져옵니다.
 getBytes()  처리하고자 하는 데이터를 Byte 배열로 변환해서 가져옵니다.
 getCursorName()  ResultSet 객체에서 사용하는 커서 이름을 가져옵니다.
 getDate()  처리하고자 하는 데이터를 자바의 Date 객체로 변환해서 가져옵니다.
 getDouble()  처리하고자 하는 데이터를 Double 형태로 변환해서 가져옵니다.
 getFloat()  처리하고자 하는 데이터를 Float  형태로 변환해서 가져옵니다.
 getDouble()  처리하고자 하는 데이터를 Double 형태로 변환해서 가져옵니다.
 getInt()  처리하고자 하는 데이터를 Integer 형태로 변환해서 가져옵니다.
 getLong()  처리하고자 하는 데이터를 Long 형태로 변환해서 가져옵니다.
 getShort()  처리하고자 하는 데이터를 Short 형태로 변환해서 가져옵니다.
 getString()  처리하고자 하는 데이터를 String 형태로 변환해서 가져옵니다.
 getTime()  처리하고자 하는 데이터를 자바의 Time 객체로 변환해서 가져옵니다.
 getTimestamp()  처리하고자 하는 데이터를 자바의 Timestamp 객체로 변환해서 가져옵니다.
 next()  ResultSet 객체가 현재 가리키고 있는 결과값의 다음 결과값을 가져옵니다.
출처 : Nate  님의 답변
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST