sql >> Base de Datos >  >> RDS >> Mysql

Prácticas de agrupación de conexiones JDBC MySql para evitar que se agote la agrupación de conexiones

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: