Sobes.tech
Junior

Kā pareizi aizvērt savienojumu ar datu bāzi?

sobes.tech AI

Atbilde no AI

Izmantojot try-with-resources bloku:

// Resursu deklarēšana, kas tiks automātiski aizvērti
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Savienojuma objekta iegūšana
    Statement statement = connection.createStatement();  // Izveidot Statement objektu
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Izpildīt vaicājumu un iegūt ResultSet
) {  
    // Darbs ar datiem no ResultSet vai citu darbību veikšana ar datubāzi
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Iespējamās izņēmumu apstrāde
    e.printStackTrace();  
}  

Šī pieeja sniedz šādus ieguvumus:

  • Automātiska aizvēršana: Resursi (Connection, Statement, ResultSet) garantēti tiks aizvērti pēc try bloka beigām, pat ja notiek izņēmums.
  • Tīrs kods: Nav nepieciešams skaidri izsaukt close() finally blokā, kas samazina boilerplate koda daudzumu.
  • Izņēmumu apstrāde: Ja resursa aizvēršanas laikā notiek izņēmums, tas netiks slēpts ar try blokā radušos izņēmumu.

Alternatīvs, mazāk ieteicams veids — skaidrs aizvēršana finally blokā:

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");  
    // Darbs ar datiem
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Skaidrs resursu aizvēršana atpakaļejošā secībā
    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();  
        }  
    }  
}  

Šis veids ir vairāk apjomīgs un vairāk pakļauts kļūdām, īpaši, apstrādājot izņēmumus, aizverot resursus. Ieteicams izmantot try-with-resources.