sql >> Database >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:sorry, er zijn al te veel klanten

Een uitleg van de volgende fout:

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

Samenvatting:

Je hebt meer dan de toegestane limiet van verbindingen met de database geopend. Je hebt zoiets als dit uitgevoerd:Connection conn = myconn.Open(); in een lus, en vergat conn.close(); . uit te voeren . Alleen omdat je klas wordt vernietigd en afval wordt verzameld, wordt de verbinding met de database niet vrijgegeven. De snelste oplossing hiervoor is ervoor te zorgen dat je de volgende code hebt met welke klasse dan ook die een verbinding tot stand brengt:

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

Plaats die code in een klas waar u een verbinding maakt. Als je klas dan wordt opgehaald, wordt je verbinding verbroken.

Voer deze SQL uit om postgresql max. toegestane verbindingen te zien:

show max_connections;

De standaard is 100. PostgreSQL op goede hardware kan een paar honderd verbindingen tegelijk ondersteunen. Als u duizenden wilt hebben, kunt u overwegen om verbindingspoolingsoftware te gebruiken om de verbindingsoverhead te verminderen.

Kijk eens precies wie/wat/wanneer/waar je connecties openhoudt:

SELECT * FROM pg_stat_activity;

Het aantal verbindingen dat momenteel wordt gebruikt is:

SELECT COUNT(*) from pg_stat_activity;

Debuggingstrategie

  1. Je zou verschillende gebruikersnamen/wachtwoorden kunnen geven aan de programma's die de verbindingen mogelijk niet vrijgeven om erachter te komen welke het is, en dan in pg_stat_activity kijken om erachter te komen welke niet zichzelf opruimt.

  2. Voer een volledige uitzonderingsstacktracering uit wanneer de verbindingen niet konden worden gemaakt en volg de code terug naar waar u een nieuwe Connection maakt , zorg ervoor dat elke coderegel waar u een verbinding maakt eindigt met een connection.close();

Hoe de max_connections hoger in te stellen:

max_connections in de postgresql.conf stelt het maximum aantal gelijktijdige verbindingen met de databaseserver in.

  1. Zoek eerst uw postgresql.conf-bestand
  2. Als je niet weet waar het is, vraag dan de database op met de sql:SHOW config_file;
  3. De mijne staat in:/var/lib/pgsql/data/postgresql.conf
  4. Log in als root en bewerk dat bestand.
  5. Zoek naar de tekenreeks:"max_connections".
  6. Je ziet een regel met de tekst max_connections=100 .
  7. Stel dat getal groter in, controleer de limiet voor uw postgresql-versie.
  8. Start de postgresql-database opnieuw om de wijzigingen door te voeren.

Wat is de maximale max_connections?

Gebruik deze zoekopdracht:

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

Ik krijg de waarde 8388607 , in theorie is dat het meeste dat u mag hebben, maar dan kan een op hol geslagen proces duizenden verbindingen opeten, en verrassend, uw database reageert niet totdat opnieuw wordt opgestart. Als je een verstandige max_connections had, zoals 100. Het gewraakte programma zou een nieuwe verbinding worden geweigerd.



  1. MySQL tussen clausule niet inbegrepen?

  2. JPA Tabelnamen in hoofdletters

  3. fout:ORA-65096:ongeldige algemene gebruiker of rolnaam in oracle

  4. SQL Server, een benoemd exemplaar converteren naar een standaardexemplaar?