sql >> Databasteknik >  >> RDS >> Mysql

MySql för många anslutningar

Med ditt tillvägagångssätt kommer anslutningen aldrig att stängas om något undantag har kastats före conn.close() kallas. Du måste skaffa den (och uttalandet och resultatuppsättningen) i ett try blockera och stäng den i finally blockera. Valfri kod i finally kommer alltid verkställas oavsett om ett undantag har kastats eller inte. Med detta kan du försäkra att de dyra resurserna kommer att stängas.

Här är en omskrivning:

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

Som sagt, den här koden är känslig för SQL-injektion attacker . Använd en PreparedStatement istället för Statement .

Se även :



  1. Hur trunkerar man alla tabeller i en databas med TSQL?

  2. mysql_install_db, fel:35, på en Mac OS X 10.9.1

  3. Varför och när ska jag använda SPARSE COLUMN? (SQL SERVER 2008)

  4. Tomma värden läggs till i alla mysql-rader istället för bara målraden