Undtagelsen angiver et typisk tilfælde af applikationskode, som lækker databaseforbindelser. Du skal sikre dig, at du erhverver og luk dem alle (Connection
, Statement
og ResultSet
) i en try-with-resources
blok i den samme metodeblok i henhold til det normale JDBC-formsprog.
public void create(Entity entity) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL_CREATE);
) {
statement.setSomeObject(1, entity.getSomeProperty());
// ...
statement.executeUpdate();
}
}
Eller når du ikke er på Java 7, i en try-finally
blok. Luk dem ind finally
vil garantere, at de også er lukket i tilfælde af undtagelser.
public void create(Entity entity) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = dataSource.getConnection();
statement = connection.prepareStatement(SQL_CREATE);
statement.setSomeObject(1, entity.getSomeProperty());
// ...
statement.executeUpdate();
} finally {
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
}
Ja, du skal stadig selv lukke forbindelser, selv når du bruger forbindelsespooling. Det er en almindelig fejl blandt startere, at de tror, at den så automatisk vil klare lukningen. Dette er ikke sandt . Forbindelsespuljen returnerer nemlig en indpakket forbindelse, som gør noget i stil med følgende i close():
public void close() throws SQLException {
if (this.connection is still eligible for reuse) {
do not close this.connection, but just return it to pool for reuse;
} else {
actually invoke this.connection.close();
}
}
Hvis du ikke lukker dem, vil forbindelsen ikke blive frigivet tilbage til puljen til genbrug, og den vil derfor erhverve en ny igen og igen, indtil DB løber tør for forbindelser, hvilket vil få din applikation til at gå ned.
Se også:
- Hvor ofte skal Connection, Statement og ResultSet lukkes i JDBC?
- Er det sikkert at bruge en statisk java.sql.Connection-instans i et multithreaded-system?
- Lukning af JDBC-forbindelser i pool