2012-12-20 9 views
1

Connection 개체에서 PreparedStatement을 얻은 다음 나중에 PreparedStatement이라는 참조를 덮어 씁니다. 그런 다음 나중에 close() 참조. 처음으로 PreparedStatement (내가 참조를 잃어 버렸던 것)이 열린 채로 남아 있습니까? 아니면 일부 프로토콜이나 가비지 콜렉션이이를 처리합니까? 예를 들어참조를 덮어 쓰면 PreparedStatement가 "열린"상태로 유지됩니까?

는 :

PreparedStatement ps = connection.prepareStatement(MY_QUERY); 
// do stuff 
ps.execute(); 

ps = connection.prepareStatement(MY_OTHER_QUERY); 
// do stuff 
ps.execute(); 

ps.close(); 

첫 번째 PreparedStatement 객체, MY_QUERY을 실행하는 데 사용되는, 열린 상태를 유지 하는가?

+0

http://stackoverflow.com/questions/8652336/jdbc-garbage-collection –

답변

7

예, PreparedStatement은 가비지 수집 될 때까지 열린 상태로 유지됩니다. * (있는 경우).

그렇기 때문에 에 대한 규칙은 항상 사용자가 취득한 외부 리소스 (예 :)를 릴리스합니다.

JDBC 리소스 (준비된 문, 연결, 결과 집합 등) 및 IO 리소스 (소켓, 스트림 등)는 Java에서 수동으로 관리해야하는 두 가지 가장 일반적인 리소스입니다.

* 엄격가 이 GCed를 얻을 수 약간 전에 할 수있는 finalize 방법을 폐쇄 할 수 말할 수 있지만, 후에는 GC에 적합하게,하지만이 토론이 충분히 가까운 거리에 있습니다.

+1

최종 의견이 finalize 메소드와 혼동 스럽습니다. – bowmore

+0

+1 자바 7에서 소개 된 리소스 블록을 사용하여 try를 사용하면 PreparedStatement가 자동으로 닫힙니다. –

+0

@bowmore : 물론. 나는'finalize'를 사용하여 그렇게 잘못 입력하는 일이 거의 없습니다. –

1

개체가 결국 가비지 수집 될 때 닫힙니다. 가비지 수집 프로세스를 거의 제어 할 수 없으므로 처리가 끝나면 곧 문을 닫는 것이 좋습니다. Statement.close()에 대한 문서에서

:

자료이 Statement 객체의 데이타베이스와 JDBC 자원 것이 아니라, 즉시 자동으로 닫힐 때 이런 일이 기다리고. 일반적으로 데이터베이스 리소스를 사용하지 않기 위해 리소스를 끝내 자마자 리소스를 해제하는 것이 좋습니다.

1

투명한 상태로 유지되며 수집 된 수거시 닫히게 될 것이라는 보장은 없습니다. 구현에 달려 있습니다. 구현은 예를 들어 FileInputStream.finalize에서와 같이 finalize를 재정의해야합니다.

"...이 파일 입력 스트림의 close 메소드가 더 이상 참조되지 않을 때 호출되도록합니다."

그러나의 Connection.close의 Connection.close에 대한 API를 참조 된 PreparedStatement를 닫을 수 있습니다 :

"즉시 ..releases이 Connection 객체의 데이타베이스와 JDBC 자원을 대신 그들 자동적 인 해제를 기다리지 ..."

이지만 풀링 된 Connection이없는 경우에만 해당됩니다.

+0

그래서'PreparedStatement'가 준비되어있는'Connection'이 닫혀 있다면, (손실 된)'PreparedStatement' 객체도 모두 닫힐 것입니까? – asteri

+0

예, DB는 닫을 때 세션/연결에 사용 된 모든 리소스를 해제합니다. 그러나 close()를 무시하기 때문에 풀링 된 연결의 경우는 그렇지 않을 수 있습니다. –

관련 문제