2014-06-12 2 views
0

재생 중 DB 연결 (JDBC)을 수동으로 닫아야합니까? 프레임 워크 (2.3.0)?재생 프레임 워크 : 닫기 JDBC 연결

예는 여기에 단지 DB.getConnection()를 수행하고 연결을 닫기에 대해 아무 말도하지 않습니다 http://www.playframework.com/documentation/2.3.x/JavaDatabase

그래서 난 믿고있어 각 GET/POST 요청에 대한) (A DB.getConnection을하고 받아 들일 만하고 나는 아무것도 닫을 필요가 없습니다. SQL 문은 어떻습니까?

conn = ds.getConnection(); 
stmt = conn.createStatement(); 
stmt.execute("SOME SQL QUERY"); 
stmt.close(); 

답변

2

:

public class DatabaseUtils { 

    private DatabaseUtils() {} 

    // Similar for Statement and ResultSet 
    public static void close(Connection c) { 
     try { 
      if (c != null) { 
       c.close(); 
      } 
     } catch { Exception e) { 
      log.error(e); 
     } 
    } 
} 

그리고 코드에 그들은 귀하의 첫 번째 질문에 대답을 참조하십시오 :

결과 연결은 자동으로 디 요청주기 마지막에 표시됩니다. 즉, 코드에서 close() 메서드를 호출하여 해당 코드를 즉시 풀로 반환 할 책임이 있습니다.

SQL 문에 관해서는 명시 적으로 닫을 필요가 없습니다. Connection.close()에 대한 Javadoc에서 그들은 다음과 같이 말합니다.

이 Connection 객체의 데이터베이스와 JDBC 자원이 자동으로 해제 될 때까지 기다리지 않고 즉시 해제합니다.

나는 또한 ... 계산서 자원을 해제한다)이 제대로의 Connection.close를 (이해한다면

+0

내가 그 놓친 방법을 모르고. 감사. –

3

이것은 데이터베이스 공급 업체에 따라 매우 나쁜 가정 일 수 있습니다.

연결은 클라이언트 및 데이터베이스 서버 구성 요소가 모두 부족한 리소스입니다. 클라이언트의 가비지 수집기는 Connection 개체를 확실히 정리할 수 있지만 서버에 연결이 끊어 졌음을 알리지는 못합니다. 유익한 자원이기 때문에 곧 서버 측에서 연결이 끊어집니다. StatementResultSet (서버 측 커서)과 동일합니다.

더 나은 해결 방법은 JDBC 연결 풀을 사용하여 연결 생성 비용을 상환하고 완료시 연결을 관리하는 것입니다.

또한 각 시도/catch 블록에 싸서 finally 블록에 SQL 자원을 닫아야합니다 : 당신이 문서를주의 깊게 읽어 보면

Connection c = null; 
try { 
    c = ds.getConnection();  
    // Do something with the connection 
} finally { 
    DatabaseUtils.close(c); // same for Statement and ResultSet 
}