ResultSet 의 close 메소드를 finally 에서 반드시 부르지 않아도 되는 이유 Programmer's notes

최근 Performazer 로 웹로직 서버를 모니터링하면서 Connection, Statement, ResultSet 등이 close 되지 않은 부분을 찾아서 수정작업을 하고 있습니다.
그런데 로그를 데이터베이스에 남길 때 사용했던 JDBCAppender 에서 Statement 를 닫지 않았다고 나오더군요.
어찌된 일인가 싶어 소스를 보니 Statement 는 다음과 같이 finally 에서 잘 닫아주고 있었습니다.
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                freeConnection();
            } catch (Exception exception) {
                if (errorOccurred) {
                    // consume exception
                } else {
                    throw (exception);
                }
            }
        }
엥? 그런데 분명히 ResultSet 도 사용하는데 rs.close() 가 보이지를 않는군요. 분명히 rs.close() 도 반드시 finally 에서 닫도록 배운 것 같았는데...
그래서 JDBC 4.0 Specification 을 찾아보았죠.
ResultSet 의 close 부분은 다음과 같이 설명이 되어있었습니다.
즉 Connection 이나 Statement 가 닫히면 ResultSet 은 따로 close() 메소드를 호출하지 않아도 명시적으로 닫힌다는 거죠.
제일 아래에 있는 Note 의 내용이을 포함해서 한 번 쯤 읽어보면 좋을 법 한 내용인 것 같아서 통째로 캡춰해서 올렸습니다.
Statement 의 close 에 대해서는 다음과 같이 나옵니다.
위의 내용을 보면 Connection 만 finally 에서 닫아도 별 문제는 없을 것 같네요.
하지만 Statement 와 ResultSet 을 닫는 것을 권고하니 해주는 것이 좋겠죠.
그리고 Statement 를 닫으면 ResultSet 을 명시적으로 닫게 되니 ResultSet 의 close() 메소드는 반드시 호출하지 않아도 될 것 같습니다.
하지만 ResultSet 변수를 재사용하거나 한다면 끊어줘야 합니다.

제가 이해한 것이 맞나요?

아무튼 Performizer 가 JDBCAppender 에서 Statement 를 닫지 않았다고 한 것은 원인을 알 수가 없군요. 쩝.

덧글

댓글 입력 영역