PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:sorry, schon zu viele Clients

Eine Erläuterung des folgenden Fehlers:

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

Zusammenfassung:

Sie haben mehr als das zulässige Limit an Verbindungen zur Datenbank geöffnet. Sie haben etwa Folgendes ausgeführt:Connection conn = myconn.Open(); innerhalb einer Schleife und vergessen, conn.close(); auszuführen . Nur weil Ihre Klasse zerstört und Garbage Collection durchgeführt wird, wird die Verbindung zur Datenbank nicht freigegeben. Die schnellste Lösung besteht darin, sicherzustellen, dass Sie den folgenden Code mit der Klasse haben, die eine Verbindung herstellt:

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

Platzieren Sie diesen Code in einer beliebigen Klasse, in der Sie eine Verbindung erstellen. Wenn Ihre Klasse dann von der Garbage Collection befreit wird, wird Ihre Verbindung getrennt.

Führen Sie diese SQL aus, um die maximal zulässigen postgresql-Verbindungen anzuzeigen:

show max_connections;

Der Standardwert ist 100. PostgreSQL kann auf guter Hardware mehrere hundert Verbindungen gleichzeitig unterstützen. Wenn Sie Tausende haben möchten, sollten Sie die Verwendung von Verbindungspooling-Software in Betracht ziehen, um den Verbindungsaufwand zu reduzieren.

Sehen Sie sich genau an, wer/was/wann/wo Ihre Verbindungen offen hält:

SELECT * FROM pg_stat_activity;

Die Anzahl der derzeit verwendeten Verbindungen beträgt:

SELECT COUNT(*) from pg_stat_activity;

Debugging-Strategie

  1. Sie könnten den Programmen, die die Verbindungen möglicherweise nicht freigeben, unterschiedliche Benutzernamen/Passwörter geben, um herauszufinden, welches es ist, und dann in pg_stat_activity nachsehen, um herauszufinden, welches nicht nach sich selbst aufräumt.

  2. Führen Sie einen vollständigen Stack-Trace für Ausnahmen durch, wenn die Verbindungen nicht erstellt werden konnten, und folgen Sie dem Code bis zu dem Punkt, an dem Sie eine neue Connection erstellen , stellen Sie sicher, dass jede Codezeile, in der Sie eine Verbindung erstellen, mit einem connection.close(); endet

So stellen Sie die max_connections höher ein:

max_connections in der postgresql.conf legt die maximale Anzahl gleichzeitiger Verbindungen zum Datenbankserver fest.

  1. Suchen Sie zuerst Ihre postgresql.conf-Datei
  2. Wenn Sie nicht wissen, wo es ist, fragen Sie die Datenbank mit dem SQL ab:SHOW config_file;
  3. Meins ist in:/var/lib/pgsql/data/postgresql.conf
  4. Melden Sie sich als root an und bearbeiten Sie diese Datei.
  5. Suchen Sie nach der Zeichenfolge:"max_connections".
  6. Sie sehen eine Zeile mit der Aufschrift max_connections=100 .
  7. Stellen Sie diese Zahl höher ein, überprüfen Sie das Limit für Ihre postgresql-Version.
  8. Starten Sie die postgresql-Datenbank neu, damit die Änderungen wirksam werden.

Was ist das Maximum von max_connections?

Verwenden Sie diese Abfrage:

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

Ich bekomme den Wert 8388607 , das ist theoretisch das Maximum, das Sie haben dürfen, aber dann kann ein außer Kontrolle geratener Prozess Tausende von Verbindungen auffressen, und überraschenderweise reagiert Ihre Datenbank bis zum Neustart nicht mehr. Wenn Sie eine vernünftige max_connections wie 100 hätten, würde dem betreffenden Programm eine neue Verbindung verweigert.