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

MySql demasiadas conexiones

Con su enfoque, la conexión nunca se cerrará si se lanza alguna excepción antes el conn.close() se llama. Debe adquirirlo (y la declaración y el conjunto de resultados) en un try bloquee y ciérrelo en el finally bloquear. Cualquier código en finally será siempre ejecutarse independientemente de que se haya lanzado una excepción o no. Con esto puedes asegurarte que los costosos recursos serán cerrados.

Aquí hay una reescritura:

public int getSiteIdFromName(String name, String company) throws DataAccessException, java.sql.SQLException {
    Connection conn = null;
    Statement smt = null;
    ResultSet rs = null;
    int id = 0;
    try {
        conn = this.getSession().connection();
        smt = conn.createStatement();
        String query = "SELECT id FROM site WHERE name='" + name + "' and company_id='" + company + "'";
        rs = smt.executeQuery(query);
        rs.next();
        id = rs.getInt("id");
    } finally {
        if (rs != null) try { rs.close(); } catch (SQLException logOrIgnore) {}
        if (smt != null) try { smt.close(); } catch (SQLException logOrIgnore) {}
        if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {}
    }
    return id;
}

Dicho esto, este código es sensible a la inyección SQL ataques . Usar una PreparedStatement en lugar de Statement .

Ver también :