PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:scusa, troppi client già

Una spiegazione del seguente errore:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Riepilogo:

Hai aperto più del limite consentito di connessioni al database. Hai eseguito qualcosa del genere:Connection conn = myconn.Open(); all'interno di un ciclo e ho dimenticato di eseguire conn.close(); . Solo perché la tua classe viene distrutta e la raccolta dei rifiuti non rilascia la connessione al database. La soluzione più rapida a questo problema è assicurarsi di avere il codice seguente con qualsiasi classe che crea una connessione:

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  

Inserisci quel codice in qualsiasi classe in cui crei una connessione. Quindi, quando la tua classe verrà raccolta, la tua connessione verrà rilasciata.

Esegui questo SQL per vedere le connessioni massime postgresql consentite:

show max_connections;

Il valore predefinito è 100. PostgreSQL su un buon hardware può supportare alcune centinaia di connessioni alla volta. Se vuoi averne migliaia, dovresti prendere in considerazione l'utilizzo di un software di pool di connessioni per ridurre il sovraccarico di connessione.

Guarda esattamente chi/cosa/quando/dove tiene aperte le tue connessioni:

SELECT * FROM pg_stat_activity;

Il numero di connessioni attualmente utilizzate è:

SELECT COUNT(*) from pg_stat_activity;

Strategia di debug

  1. Potresti dare nomi utente/password diversi ai programmi che potrebbero non rilasciare le connessioni per scoprire quale sia, quindi guardare in pg_stat_activity per scoprire quale non sta ripulendo da solo.

  2. Esegui una traccia completa dello stack di eccezioni quando non è stato possibile creare le connessioni e segui il codice fino al punto in cui crei una nuova Connection , assicurati che ogni riga di codice in cui crei una connessione termini con un connection.close();

Come impostare max_connections più in alto:

max_connections in postgresql.conf imposta il numero massimo di connessioni simultanee al server di database.

  1. Prima trova il tuo file postgresql.conf
  2. Se non sai dove si trova, interroga il database con sql:SHOW config_file;
  3. Il mio è in:/var/lib/pgsql/data/postgresql.conf
  4. Accedi come root e modifica quel file.
  5. Cerca la stringa:"max_connections".
  6. Vedrai una riga che dice max_connections=100 .
  7. Imposta quel numero più grande, controlla il limite per la tua versione postgresql.
  8. Riavvia il database postgresql per rendere effettive le modifiche.

Qual ​​è il numero massimo di connessioni_massime?

Usa questa query:

select min_val, max_val from pg_settings where name='max_connections';

Ottengo il valore 8388607 , in teoria è il massimo che puoi avere, ma poi un processo in fuga può consumare migliaia di connessioni e, sorpresa, il tuo database non risponde fino al riavvio. Se avessi un max_connections ragionevole come 100. Al programma incriminato verrebbe negata una nuova connessione.