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
trybloka beigām, pat ja notiek izņēmums. - Tīrs kods: Nav nepieciešams skaidri izsaukt
close()finallyblokā, kas samazina boilerplate koda daudzumu. - Izņēmumu apstrāde: Ja resursa aizvēršanas laikā notiek izņēmums, tas netiks slēpts ar
tryblokā 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.