Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySql trop de connexions

Avec votre approche, la connexion ne sera jamais fermée si une exception a été levée avant le conn.close() est appelé. Vous devez l'acquérir (ainsi que l'instruction et le jeu de résultats) dans un try bloquez-le et fermez-le dans le finally bloquer. Tout code dans finally sera toujours être exécuté qu'une exception ait été levée ou non. Avec cela, vous pouvez assurer que les ressources coûteuses seront fermées.

Voici une réécriture :

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;
}

Cela dit, ce code est sensible à l'injection SQL attaques . Utiliser un PreparedStatement au lieu de Statement .

Voir aussi :