IT

Java에서 데이터베이스 연결 닫기

lottoking 2020. 8. 5. 07:38
반응형

Java에서 데이터베이스 연결 닫기


약간 혼란스러워 http://en.wikipedia.org/wiki/Java_Database_Connectivity 에서 아래를 읽고 .

Connection conn = DriverManager.getConnection(
     "jdbc:somejdbcvendor:other data needed by some jdbc vendor",
     "myLogin",
     "myPassword" );

Statement stmt = conn.createStatement();
try {
    stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
    //It's important to close the statement when you are done with it
    stmt.close();
}

연결을 닫을 필요가 없습니까? conn.close ()가 발생하지 않는 염색으로부터?

현재 유지 관리하고있는 개인 웹 응용 프로그램이 현재 어느 양식도 닫지 중요한 것은 실제로 stmt, conn 또는 둘 다입니까?

사이트가 간헐적으로 중단 서버는 데이터베이스 연결 문제라고 계속 서버입니다. 내 의심은 닫히지 않았다는 것입니다.하지만 어느 것이 닫힐 지 모르겠습니다.


사용한 작업이을 끝나면 연결이 유지 될 수있는 다른 데이터베이스 리소스 (커서, 핸들 등) 해제하기 위해를 메서드를 Connection호출하여 명시 적으로 닫아야합니다 close().

사실, 자바의 안전 패턴은 당신이 종료 하는 것입니다 ResultSet, Statement그리고 Connection의 (순서대로) finally처럼, 블록 당신이 그들과 함께 할 때 뭔가를 :

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    // Do stuff
    ...

} catch (SQLException ex) {
    // Exception handling stuff
    ...
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* ignored */}
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) { /* ignored */}
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) { /* ignored */}
    }
}

finally블록 약간 (널 검사를 피하기 위해)로 개선 될 수있다 :

} finally {
    try { rs.close(); } catch (Exception e) { /* ignored */ }
    try { ps.close(); } catch (Exception e) { /* ignored */ }
    try { conn.close(); } catch (Exception e) { /* ignored */ }
}

그러나 여전히 매우 매우 장황에서는 일반적으로 도우미 클래스를 사용하여 null 안전 도우미 메서드에서 개체를 닫고 finally블록은 다음과 같이됩니다.

} finally {
    DbUtils.closeQuietly(rs);
    DbUtils.closeQuietly(ps);
    DbUtils.closeQuietly(conn);
}

그리고 실제로 Apache Commons DbUtils 에는 DbUtils정확하게이를 수행 하는 클래스가 있으므로 직접 작성할 필요가 없습니다.


사용 후에는 항상 데이터베이스 / 리소스 개체를 닫는 것이 좋습니다. finally블록 에서 연결, 결과 집합 및 문 개체를 닫는 것이 좋습니다.

Java7까지는 이러한 모든 리소스를 finally블록을 사용하여 닫아야합니다 . Java 7을 사용하는 경우 리소스를 닫기 위해 다음과 같이 할 수 있습니다.

try(Connection con = getConnection(url, username, password, "org.postgresql.Driver");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
) {

//statements
}catch(....){}

이제 con, stmt 및 rs 객체는 try 블록의 일부가되고 java는 사용 후 이러한 리소스를 자동으로 닫습니다.

도움이 되었기를 바랍니다.


그냥 닫습니다 충분 Statement하고 Connection. ResultSet개체 를 명시 적으로 닫을 필요가 없습니다 .

Java 문서는 다음에 대해 말합니다 java.sql.ResultSet.

ResultSet 오브젝트는 해당 Statement 오브젝트가 닫히거나 다시 실행될 때이를 생성 한 Statement 오브젝트에 의해 자동으로 닫히거나 여러 결과 시퀀스에서 다음 결과를 검색하는 데 사용됩니다.


코멘트에 대해 BalusC에게 감사드립니다 : "나는 그것에 의존하지 않을 것입니다. 일부 JDBC 드라이버는 그것에 실패합니다."


예. 결과 집합, 문 및 연결을 닫아야합니다. 연결이 풀에서 제공된 경우 연결을 닫으면 실제로 다시 풀로 다시 보내 재사용됩니다.

일반적으로이 작업을 finally{}블록 에서 수행 해야하므로 예외가 발생하더라도이를 닫을 기회가 있습니다.

많은 프레임 워크가이 리소스 할당 / 할당 해제 문제를 처리합니다. 예 : Spring의 JdbcTemplate . Apache DbUtils 에는 null 여부에 관계없이 결과 집합 / 문 / 연결을 닫은 후 (그리고 닫을 때 예외를 포착하는) 방법이 있습니다.


예, 연결을 종료해야합니다. 그렇지 않으면 데이터베이스 클라이언트는 일반적으로 소켓 연결 및 기타 리소스를 열어 둡니다.


실제로 try-with-resources 블록을 사용하는 것이 가장 좋으며 try 블록을 종료 할 때 Java가 모든 연결을 자동으로 닫습니다.

AutoClosable을 구현하는 모든 개체로이 작업을 수행해야합니다.

try (Connection connection = getDatabaseConnection(); Statement statement = connection.createStatement()) {
    String sqlToExecute = "SELECT * FROM persons";
    try (ResultSet resultSet = statement.execute(sqlToExecute)) {
        if (resultSet.next()) {
            System.out.println(resultSet.getString("name");
        }
    }
} catch (SQLException e) {
    System.out.println("Failed to select persons.");
}

getDatabaseConnection에 대한 호출이 구성됩니다. JDBC SQL 연결 또는 풀에서 연결을 가져 오는 호출로 바꾸십시오.

참고 URL : https://stackoverflow.com/questions/2225221/closing-database-connections-in-java

반응형