org.postgresql.util.PSQLException: IRREVERSIBILE: spiacenti, già troppi client


93

Sto provando a connettermi a un database Postgresql, ricevo il seguente errore:

Errore: org.postgresql.util.PSQLException: IRREVERSIBILE: spiacenti, già troppi client

Cosa significa l'errore e come risolverlo?

Il mio server.propertiesfile sta seguendo:

serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1

Risposte:


38

Non sappiamo quale sia il file server.properties , né sappiamo cosa significhi SimocoPoolSize (vero?)

Supponiamo che tu stia utilizzando un pool personalizzato di connessioni al database. Quindi, immagino che il problema sia che il tuo pool è configurato per aprire 100 o 120 connessioni, ma il tuo server Postgresql è configurato per accettare MaxConnections=90. Queste sembrano impostazioni conflittuali. Prova ad aumentare MaxConnections=120.

Ma dovresti prima capire la tua infrastruttura di livello db, sapere quale pool stai utilizzando, se hai davvero bisogno di così tante connessioni aperte nel pool. E, specialmente, se stai restituendo con garbo le connessioni aperte al pool


168

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

  1. 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.

  2. 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.

  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 il 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 di postgresql.
  8. 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.


4
perché alcune persone dimenticano il carattere ";" dopo le istruzioni SQL ?! Fa copia e incolla un trascinamento :)
codervince

@codervince Devi prestare attenzione. Vorrei quasi arrivare a dire che dovresti trascrivere i comandi piuttosto che copiare + incollare.
AVProgrammer

4

Non è necessario aumentare MaxConnections e InitialConnections. Chiudi le connessioni dopo aver terminato il tuo lavoro. Ad esempio, se stai creando una connessione:

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}

Dopo aver svolto il tuo lavoro, chiudi la connessione:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

11
Chiudi sempre le connessioni nel blocco finale! Altrimenti la connessione rimane aperta se si verifica un errore.
tine2k

1

Le linee offensive sono le seguenti:

MaxConnections=90
InitialConnections=80

È possibile aumentare i valori per consentire più connessioni.


4
E se avrai più connessioni consentite, regola anche i parametri di memoria per allinearti con connessioni aumentate.
Kuberchaun

0

Ad esempio, devi chiudere tutte le tue connessioni: se fai un'istruzione INSERT INTO devi chiudere l'istruzione e la tua connessione in questo modo:

statement.close();
Connexion.close():

E se fai un'istruzione SELECT devi chiudere l'istruzione, la connessione e il gruppo di risultati in questo modo:

resultset.close();
statement.close();
Connexion.close();

L'ho fatto e ha funzionato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.