2012-08-01 4 views
1

나는 종종, 분명히 자원 constatement 메소드가 완료되면 종료됩니다,이 경우,메서드가 종료 될 때 연결과 문을 닫아야합니까? JDBC에서

void databaseCall() { 
    Connection con = null; 
    Statement statement = null   
    try {  
      con = getConnection(...);  
      statement = con.createStatement(...);   
      // do some query 
    } catch (SQLException e) { 
     // bla bla 
    } finally { 
     try {con.close();} catch (Exception e1) {} 
     try {statement.close();} catch (Exception e1) {} 
    } 
} 

같은 조각이 나는 그것이 연결 및 문 명시 적를 닫 가장 좋은 방법은 알고가 발생하지만, literatur 즉, try 블록이 완료되면. finally 블록의 close 문이 정말로 필요합니까? 우리가 자원을 명시 적으로 공개하지 않더라도 방법이 끝나면 어떤 방식 으로든 닫히지 않겠습니까?

+0

'close()'는'finally' 블록을 호출합니다. 그리고 네, 일부 DBMS는 리소스를 적절히 닫지 않으면 클라이언트 프로그램이 종료 되더라도 계속해서 처리합니다. –

+0

감사합니다. 수정 됨. – gefei

+0

@ G.Z. 당신의 의심과 유사 [여기] (http://stackoverflow.com/questions/11750708/statement-and-resultset-close-after-connection-close) – user75ponic

답변

4

아니요, 폐쇄되지 않았을 것입니다.

getConnection()이 새 Connection을 만드는 경우 메서드의 마지막에서 Connection이 가비지 수집 될 수 있다는 것입니다. 그러나 GC는 close() 메소드를 호출하지 않습니다. 그리고 어쨌든, 가능한 한 빨리 닫고 싶습니다.

대개의 경우 getConnection()은 연결 풀에서 연결을 가져오고 그 연결은 매우 오랫동안 열려 있습니다. close() 연결을 사용하지 않으면 사용 가능한 연결 풀로 되돌아 가지 않으며 몇 초 또는 몇 분 후에 더 이상 연결을 사용할 수 없습니다.

제목은 System.exit()에 대해 묻지 만 문제의 몸은 아닙니다. System.exit()으로 전화하면 데이터베이스에 통신이 끊어짐을 알리기 때문에 연결이 닫히게됩니다. 그러나 프로그램 시작, 쿼리 실행 및 종료는 매우 드뭅니다. 대부분의 응용 프로그램은 며칠 또는 몇 달 동안 실행되고 시작됩니다. 따라서 일단 사용을 마쳤 으면 실제로 연결을 해제하려고합니다.

-2

ekart 응용 프로그램에 20 개의 연결이 있다고 가정합니다. 연결 풀의 연결 수는 20 개입니다. 서버에 요청을 보내면 풀이 모든 요청에 ​​대한 연결을 제공합니다. 연결을 닫지 않으면 20 번째 요청 후에 풀이됩니다. 'OutOfConnectionError'조차도이 오류를 처리 할 수없고 연결이 없기 때문에 요청을 보낼 수 없습니다. 연결을 닫으면 새 요청을 보낼 수 있습니다 .........

관련 문제