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

org.postgresql.util.PSQLEundtagelse:FATAL:beklager, for mange klienter allerede

En forklaring på følgende fejl:

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

Oversigt:

Du åbnede mere end den tilladte grænse for forbindelser til databasen. Du kørte noget som dette:Connection conn = myconn.Open(); inde i en loop, og glemte at køre conn.close(); . Bare fordi din klasse er ødelagt og skrald indsamlet frigiver ikke forbindelsen til databasen. Den hurtigste løsning på dette er at sikre, at du har følgende kode med den klasse, der skaber en forbindelse:

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

Placer den kode i en hvilken som helst klasse, hvor du opretter en forbindelse. Så når din klasse bliver samlet affald, vil din forbindelse blive frigivet.

Kør denne SQL for at se postgresql max forbindelser tilladt:

show max_connections;

Standard er 100. PostgreSQL på god hardware kan understøtte et par hundrede forbindelser ad gangen. Hvis du vil have tusindvis, bør du overveje at bruge software til forbindelsespooling for at reducere forbindelsesomkostningerne.

Tag et kig på præcis, hvem/hvad/hvornår/hvor der holder dine forbindelser åbne:

SELECT * FROM pg_stat_activity;

Antallet af forbindelser, der bruges i øjeblikket, er:

SELECT COUNT(*) from pg_stat_activity;

Fejlretningsstrategi

  1. Du kan give forskellige brugernavne/adgangskoder til de programmer, der måske ikke frigiver forbindelserne for at finde ud af, hvilken det er, og så se i pg_stat_activity for at finde ud af, hvilken der ikke rydder op efter sig selv.

  2. Foretag en fuld undtagelsesstacksporing, når forbindelserne ikke kunne oprettes, og følg koden tilbage til, hvor du opretter en ny Connection , sørg for, at hver kodelinje, hvor du opretter en forbindelse, slutter med en connection.close();

Sådan indstiller du max_connections højere:

max_connections i postgresql.conf indstiller det maksimale antal samtidige forbindelser til databaseserveren.

  1. Find først din postgresql.conf-fil
  2. Hvis du ikke ved, hvor den er, forespørg databasen med sql:SHOW config_file;
  3. Min er i:/var/lib/pgsql/data/postgresql.conf
  4. Log ind som root, og rediger den fil.
  5. Søg efter strengen:"max_connections".
  6. Du vil se en linje, der siger max_connections=100 .
  7. Sæt det nummer større, tjek grænsen for din postgresql-version.
  8. Genstart postgresql-databasen for at ændringerne træder i kraft.

Hvad er det maksimale max_connections?

Brug denne forespørgsel:

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

Jeg får værdien 8388607 , i teorien er det det meste, du har lov til at have, men så kan en løbsk proces æde tusindvis af forbindelser, og overraskelse, din database reagerer ikke, indtil genstart. Hvis du havde en fornuftig max_connections som 100. Det stødende program ville blive nægtet en ny forbindelse.



  1. Sådan tilføjes identitetskolonne til tabel med TSQL og GUI i SQL Server - SQL Server / T-SQL vejledning del 40

  2. Postgresql :Hvordan vælger jeg top n procent(%) poster fra hver gruppe/kategori

  3. Bedste databasefelttype for en URL

  4. Er det muligt at udføre flere opdateringer med en enkelt UPDATE SQL-sætning?