Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL za dużo połączeń

Dzięki Twojemu podejściu połączenie nigdy nie zostanie zamknięte, jeśli zostanie zgłoszony jakikolwiek wyjątek przed conn.close() jest nazywany. Musisz go zdobyć (oraz instrukcję i zestaw wyników) w try zablokuj i zamknij go w finally blok. Dowolny kod w finally będzie zawsze być wykonywane niezależnie od tego, czy został zgłoszony wyjątek, czy nie. Dzięki temu możesz zapewnić że drogie zasoby zostaną zamknięte.

Oto przepis:

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

To powiedziawszy, ten kod jest wrażliwy na wstrzyknięcie SQL ataki . Użyj PreparedStatement zamiast Statement .

Zobacz też :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL łączy ciąg znaków z kolumną

  2. Przywróć zamówienia woocommerce

  3. Jak zapobiec wstrzykiwaniu sql w nodejs i sequelizie?

  4. Utwórz bazę danych mysql i użytkownika w skrypcie bash

  5. BŁĄD 1054 (42S22):Nieznana kolumna „‍‍” w „liście pól”