Sobes.tech
Junior

Como fechar corretamente a conexão com a base de dados?

sobes.tech IA

Resposta da IA

Utilizando o bloco try-with-resources.

// Declaração de recursos que serão fechados automaticamente
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Obtenção do objeto Connection
    Statement statement = connection.createStatement();  // Criação do objeto Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Execução da consulta e obtenção do ResultSet
) {  
    // Trabalhar com os dados do ResultSet ou realizar outras operações com a base de dados
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Tratamento de possíveis exceções SQLException
    e.printStackTrace();  
}  

Vantagens desta abordagem:

  • Fecho automático: Os recursos (Connection, Statement, ResultSet) serão garantidamente fechados após sair do bloco try, mesmo que ocorram exceções.
  • Código limpo: Não requer chamadas explícitas a close() no bloco finally, o que reduz a quantidade de código boilerplate.
  • Tratamento de exceções: Se ocorrer uma exceção ao fechar o recurso, ela não será suprimida pela exceção ocorrida dentro do bloco try.

Método alternativo, menos preferido, com fecho explícito no bloco finally:

Connection connection = null;  
Statement statement = null;  
ResultSet resultSet = null;  

try {  
    connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");  
    statement = connection.createStatement();  
    resultSet = statement.executeQuery("SELECT 1");  
    // Trabalhar com os dados
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Fecho explícito de recursos na ordem inversa à sua obtenção
    if (resultSet != null) {  
        try {  
            resultSet.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    if (statement != null) {  
        try {  
            statement.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    if (connection != null) {  
        try {  
            connection.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
}  

Este método é mais trabalhoso e propenso a erros, especialmente ao lidar com exceções durante o fechamento de recursos. Recomenda-se usar try-with-resources.