본문 바로가기

프레임워크/Spring

Closing a statement you left open, please do your own housekeeping

환경: JDK1.6.0_21 + JBoss EAP 4.3.2 + Spring 2.5.6 + iBATIS 2.3.4

19:50:53,405 WARN  [WrappedConnection] Closing a statement you left open, please do your own housekeeping
java.lang.Throwable: STACKTRACE
at org.jboss.resource.adapter.jdbc.WrappedConnection.registerStatement(WrappedConnection.java:872)
at org.jboss.resource.adapter.jdbc.WrappedStatement.<init>(WrappedStatement.java:62)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.<init>(WrappedPreparedStatement.java:56)
at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:241)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:225)


Closing statements and ResultSets is important if you want to use prepared statement caching and/or don't won't to leak cursors in your database.


만약 prepared statement 캐슁을 사용하길 원하면서 데이터베이스의 커서가 누출(leak) 되지 않게 하려면 statements 와 ResultSets 을 닫아주는 것은 중요하다.


위의 링크를 참고해 보면 Connection leak 등을 추적하기 위한 용도로 사용하는 건데 사실 실제 소스코드를 보면 connection을 닫으려고 시도하고 있다. 만약 
Exception trying to close statement:
와 같은 경고를 만났다면 Connection leak이 발생할 수는 있다. 그러나 

Closing a statement you left open, please do your own housekeeping

와 같은 경고는 Connection을 생성한 곳에서 닫아야 한다는 원칙을 개발자에게 상기시켜주면서 해당 컨넥션을 닫아 주려고 시도한다.

결론은 트랜잭션이 제대로 설정되어 있지 않아서 Statement에 대해서 commit 이나 rollback이 발생하지 않았으므로 확인하라는 내용이다.

역시 경고는 무시하면 안된다.