2012-09-04 4 views
5

안녕하세요 모두 나는 그것이 오래된 질문이지만 그냥 궁금해서 오늘날 알고 있었다. 우리는 connection.close가 preparedStatement를 닫을 것이라는 것을 안다. (내가 잘못하면 나를 바로 잡는다.) 하지만 연결이 닫히면 close 준비 스테이먼트JDBC 연결 가까이 PreparedStatement의 가까운

conn.close(); 
ps.close(); 

nullpointer 예외가 발생합니까? 누군가가 말했듯이

는 conn.close 전에 앞서 먼저 가까운 실행 자신의 작업을 완료하고 그래서 당신은 늘 nullpointer를 얻을 것이다 JVM의 speed.sometimes의 ps.close()에 따라 달라집니다. 그 테스트하기 위해

, 나는 코드

conn.close(); 
Thread.sleep(5000);//I give 5s to conn.close to finish his work. should be enough 
ps.close(); 

를 수정하지만 난 nullpointer을하지 않았다.

그래서 제 질문은 내가 CONN 먼저 다음 PS를 닫으면 여기에 무슨 일이 있었는지입니다.

감사합니다.

답변

4

Javadoc을 Statement.close()에 대한 상태 :

이미 닫혀 아무런 효과가없는 Statement 개체의 방법 close를 호출. 내가 제안

는 그 구현이 명세서가 이미 Connection.close() 호출에 의해 폐쇄 된 경우 예외를 던지지한다고 의미한다. 당신이 이미 닫힌 문을 닫으면

0

동작은 드라이버 구현 또는 연결 풀러 구현에 따라 다릅니다. 기본적으로 기본 연결/문/결과 세트를 꾸미고 상태를 추적합니다. 따라서 구현은 기본 객체를 닫기 전에 종속 객체를 닫을 수 있습니다. close() 방법 (연결을 풀 (pool)로 반환 오버라이드 (override)되어 있음) Connection에 호출 될 때 닫히지 않은 문이나 결과에 대한 경고를 인쇄하는 데 사용 Primrose 연결 풀러.

+0

JDBC 스펙은 이것에 대해 매우 분명하다 : 연결을 닫는 것은 적어도 사용자의 관점에서 (모든 종속 오브젝트를 종료하며 수영장 내부에 열려 수있는 문을 풀링의 경우,하지만 그 진술에 사용자가-처리에해야 마치 마치 닫힌 것처럼 행동). 이미 닫힌 JDBC 자원 (연결, 명령문, 결과 집합 등)을 닫으면 아무런 효과가 없습니다 (오류가없는 등). –

+0

나는 풀러에 의해 반환 된 장식 된 연결에 대해 이야기하고 있었고 그러한 장식 된 연결에 대한 긴밀한 호출은 기본 물리적 연결을 닫지 않습니다. 우리가 그 점에 동의합니까? 이제 풀러는이 연결에 해당하는 명령문/결과 집합을 확인하고 연결의 닫기 호출에서 닫을 수 있습니까? 내가 네가 맞기를 바란다. – Vikdor

1

는 Statement 인터페이스의 javadoc는 당으로

close 
void close() 
      throws SQLExceptionReleases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. 
**Calling the method close on a Statement object that is already closed has no effect.** 

그래서 어떤 문제가되지 않습니다.