Una spiegazione del seguente errore:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Sommario:
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 ti sei dimenticato di eseguire conn.close();. Solo perché la tua classe viene distrutta e la raccolta dati obsoleta non rilascia la connessione al database. La soluzione più rapida è assicurarti di avere il seguente codice 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 viene raccolta dalla spazzatura, la tua connessione verrà rilasciata.
Esegui questo SQL per vedere le connessioni massime di 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 considerare l'utilizzo di un software di pool di connessioni per ridurre il sovraccarico della connessione.
Dai un'occhiata a 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
Potresti dare diversi nomi utente / password ai programmi che potrebbero non rilasciare le connessioni per scoprire quale sia, quindi cercare in pg_stat_activity per scoprire quale non sta ripulendo dopo se stesso.
Esegui un'analisi completa dello stack delle eccezioni quando non è stato possibile creare le connessioni e segui il codice fino al punto in cui ne crei uno nuovo Connection, assicurati che ogni riga di codice in cui crei una connessione termini con unconnection.close();
Come impostare max_connections su un valore più alto:
max_connections in postgresql.conf imposta il numero massimo di connessioni simultanee al server database.
- Prima trova il tuo file postgresql.conf
- Se non sai dove si trova, interroga il database con sql:
SHOW config_file;
- Il mio è in:
/var/lib/pgsql/data/postgresql.conf
- Accedi come root e modifica il file.
- Cerca la stringa: "max_connections".
- Vedrai una riga che dice
max_connections=100.
- Imposta quel numero più grande, controlla il limite per la tua versione di postgresql.
- Riavvia il database postgresql affinché le modifiche abbiano effetto.
Qual è il numero massimo di connessioni max?
Usa questa query:
select min_val, max_val from pg_settings where name='max_connections';
Capisco il valore 8388607, in teoria è il massimo che ti è permesso avere, ma poi un processo incontrollato 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.