La excepción indica un caso típico de código de aplicación que pierde conexiones de base de datos. Debe asegurarse de adquirir y ciérrelos todos (Connection
, Statement
y ResultSet
) en un try-with-resources
bloque en el mismo bloque de método de acuerdo con el lenguaje JDBC normal.
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();
}
}
O cuando no estás en Java 7, en un try-finally
cuadra. Cerrándolos en finally
garantizará que también se cierren en caso de excepciones.
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) {}
}
}
Sí, aún necesita cerrar las conexiones usted mismo, incluso cuando usa la agrupación de conexiones. Es un error común entre los principiantes que piensan que automáticamente manejará el cierre. Esto no es cierto . El conjunto de conexiones devuelve una conexión envuelta que hace algo como lo siguiente en 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();
}
}
Si no los cierra, la conexión no se devolverá al grupo para su reutilización y, por lo tanto, adquirirá una nueva una y otra vez hasta que la base de datos se quede sin conexiones, lo que hará que su aplicación se bloquee.
Ver también:
- ¿Con qué frecuencia se deben cerrar Connection, Statement y ResultSet en JDBC?
- ¿Es seguro usar una instancia java.sql.Connection estática en un sistema multiproceso?
- Cerrar conexiones JDBC en el pool