Sobes.tech
Junior

Как правилно да затворите връзката с базата данни?

sobes.tech AI

Отговор от AI

Използване на блок try-with-resources.

// Обявяване на ресурсите, които ще бъдат автоматично затворени
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Получаване на обект Connection
    Statement statement = connection.createStatement();  // Създаване на обект Statement
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Изпълнение на заявката и получаване на ResultSet
) {  
    // Работа с данните от ResultSet или изпълнение на други операции с базата данни
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Обработка на възможни изключения SQLException
    e.printStackTrace();  
}  

Предимства на този подход:

  • Автоматично затваряне: Ресурсите (Connection, Statement, ResultSet) ще бъдат гарантирано затворени след излизане от блока try, дори ако възникне изключение.
  • Чист код: Не изисква явен извикване на close() в блока finally, което намалява количеството boilerplate код.
  • Обработка на изключения: Ако по време на затваряне на ресурса възникне изключение, то няма да бъде потиснато от изключението, възникнало вътре в блока try.

Алтернативният, по-малко предпочитан начин с явното затваряне в блока 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");  
    // Работа с данните
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Явно затваряне на ресурсите в обратен ред на тяхното получаване
    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();  
        }  
    }  
}  

Този метод е по-обемен и по-склонен към грешки, особено при обработка на изключения при затваряне на ресурсите. Предпочита се използването на try-with-resources.