Google AdSense


[Java] ResultSet이 close 되는 경우 by Sigel

DB작업을 하는 도중 갑자기 ResultSet이 close 돼서 사용할 수 없다고 예외가 발생했다.

java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:770)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7001)
    어쩌구 저쩌구..

난 단순히 ResultSet.next()를 호출했을뿐인데 TㅅT 이 ResultSet은 finally에서만 close()를 하는데 무슨 헛소리냐며 구글링을 시작했다. 뭐 몇 번 뒤적이지도 않고 나왔다. 그것도 API에서 @ㅅ@ ResultSet은 Statement가 close되면 함께 close된다는 것이다. 헌데 이 코드는 Statement를 전역으로 선언해서 사용하기 때문에 절대로 닫지 않는다.

대체 누가 Statement를 전역으로 사용하는거얏!! 그것도 argument를 지정해 주는 PreparedStatement를.. 게다가 동기화도 없이!! 응?? 동기화?? 그렇다!! 이 코드는 동기화 없이 전역 변수으로 생성해 놓은 PreparedStatement를 무식할 정도로 사용하고 있었고.. ResultSet의 값을 가져오는 과정에서 다른 스레드가 동일한 PreparedStatement를 사용해서 문제가 된 것이다.


정리를 해보면.. ResultSet은.. 다음과 같은 경우 닫힌다. close 된다.
1. ResultSet을 가져온 Statement가 close된 경우
2. ResultSet을 가져온 Statement가 또 다시 query를 수행한 경우
3. multiple results에서 다음 ResultSet을 가져오기 위해 next()를 수행한 경우


+ 그리고 명심하자!! Statement는 전역변수처럼 공용으로 사용하지도 말고, 꼭 필요한 경우(필요할까?? -ㅅ-a) 동기화 처리를 해서 사용하자!!

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://entireboy.egloos.com/tb/4174951 [도움말]

덧글

덧글 입력 영역