Sobes.tech
Junior

Kako pravilno zatvoriti vezu sa bazom podataka?

sobes.tech АИ

Одговор од АИ

Користећи блок 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.