Die Ausnahme weist auf einen typischen Fall von Anwendungscode hin, der Datenbankverbindungen verliert. Sie müssen sicherstellen, dass Sie und erwerben schließen Sie alle (Connection
, Statement
und ResultSet
) in einem try-with-resources
block im selben Methodenblock gemäß dem normalen JDBC-Idiom.
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();
}
}
Oder wenn Sie nicht auf Java 7 sind, in einem try-finally
Block. Schließen Sie sie in finally
garantiert, dass sie auch im Ausnahmefall geschlossen werden.
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, Sie müssen Verbindungen immer noch selbst schließen, auch wenn Sie Verbindungspooling verwenden. Es ist ein häufiger Fehler unter Startern, dass sie denken, dass es dann automatisch das Schließen handhabt. Das ist nicht wahr . Der Verbindungspool gibt nämlich eine umschlossene Verbindung zurück, die in close() etwa Folgendes tut:
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();
}
}
Sie nicht zu schließen, würde dazu führen, dass die Verbindung nicht zur Wiederverwendung an den Pool freigegeben wird und daher immer wieder eine neue erhält, bis die DB keine Verbindungen mehr hat, was zum Absturz Ihrer Anwendung führt.
Siehe auch:
- Wie oft sollen Connection, Statement und ResultSet in JDBC geschlossen werden?
- Ist es sicher, eine statische java.sql.Connection-Instanz in einem Multithread-System zu verwenden?
- Schließen von JDBC-Verbindungen im Pool