web-dev-qa-db-de.com

org.postgresql.util.PSQLException: FATAL: Entschuldigung, zu viele Kunden bereits

Ich versuche, eine Verbindung zu einer Postgresql-Datenbank herzustellen. Ich erhalte den folgenden Fehler:

Fehler: org.postgresql.util.PSQLException: FATAL: Entschuldigung, zu viele Kunden bereits

Was bedeutet der Fehler und wie kann ich ihn beheben?

Meine server.properties-Datei sieht folgendermaßen aus:

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
62
lakshmi

Wir wissen nicht welche server.properties Datei das ist, wir wissen auch nicht was SimocoPoolSize bedeutet (oder?)

Nehmen wir an, Sie verwenden einen benutzerdefinierten Pool von Datenbankverbindungen. Ich schätze, das Problem ist dann, dass Ihr Pool so konfiguriert ist, dass er 100 oder 120 Verbindungen öffnet, der Postgresql-Server jedoch MaxConnections=90 akzeptiert. Diese Einstellungen scheinen widersprüchlich zu sein. Versuchen Sie, MaxConnections=120 zu erhöhen.

Sie sollten jedoch zuerst Ihre Infrastruktur für die db-Schicht verstehen und wissen, welchen Pool Sie verwenden, wenn Sie wirklich so viele offene Verbindungen im Pool benötigen. Und vor allem, wenn Sie die geöffneten Verbindungen ordnungsgemäß in den Pool zurückbringen

26
leonbloy

Eine Erklärung des folgenden Fehlers:

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

Zusammenfassung:

Sie haben mehr als die zulässige Anzahl von Verbindungen zur Datenbank geöffnet. Sie haben Folgendes ausgeführt: Connection conn = myconn.Open(); in einer Schleife und vergessen, conn.close(); auszuführen. Nur weil Ihre Klasse zerstört und Müll gesammelt wird, wird die Verbindung zur Datenbank nicht freigegeben. Die schnellste Lösung besteht darin, sicherzustellen, dass Sie den folgenden Code mit einer beliebigen Klasse haben, die eine Verbindung erstellt:

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

Fügen Sie diesen Code in eine Klasse ein, in der Sie eine Verbindung erstellen. Wenn dann Ihre Klasse Müll gesammelt wird, wird Ihre Verbindung freigegeben.

Führen Sie diese SQL aus, um die maximal zulässigen Verbindungen für postgresql 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 Verbindungspoolsoftware in Betracht ziehen, um den Verbindungsaufwand zu verringern.

Schau dir genau an, wer/was/wann/wo deine Verbindungen offen hält:

SELECT * FROM pg_stat_activity;

Die Anzahl der aktuell verwendeten Verbindungen ist:

SELECT COUNT(*) from pg_stat_activity;

Debugging-Strategie

  1. Sie können den Programmen, die möglicherweise die Verbindungen nicht freigeben, unterschiedliche Benutzernamen/Kennwörter geben, um herauszufinden, um welches es sich handelt, und dann in pg_stat_activity nachsehen, um herauszufinden, welches Programm nicht aufräumt.

  2. Führen Sie eine vollständige Ausnahmestapelverfolgung durch, wenn die Verbindungen nicht erstellt werden konnten, und folgen Sie dem Code, bis Sie eine neue Connection erstellen. Stellen Sie sicher, dass jede Codezeile, in der Sie eine Verbindung erstellen, mit einem connection.close(); endet.

So setzen Sie die max_connections höher:

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 größer ein, und überprüfen Sie das Limit für Ihre postgresql-Version.
  8. Starten Sie die postgresql-Datenbank neu, damit die Änderungen wirksam werden.

Was ist die maximale max_connections?

Verwenden Sie diese Abfrage:

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

Ich erhalte den Wert 8388607, theoretisch ist das der größte Wert, den Sie haben dürfen, aber dann kann ein außer Kontrolle geratener Prozess Tausende von Verbindungen aufzehren, und es überrascht, dass Ihre Datenbank bis zum Neustart nicht mehr reagiert. Wenn Sie eine vernünftige max_connections wie 100 hätten. Dem fehlerhaften Programm würde eine neue Verbindung verweigert.

133
Eric Leschinski

MaxConnections & InitialConnections müssen nicht erhöht werden. Schließen Sie einfach Ihre Verbindungen, nachdem Sie Ihre Arbeit erledigt haben. Zum Beispiel, wenn Sie eine Verbindung erstellen:

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

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

Nachdem Sie Ihre Arbeit erledigt haben, schließen Sie die Verbindung:

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

Sie müssen beispielsweise alle Ihre Verbindungen schließen: Wenn Sie eine INSERT INTO-Anweisung abgeben, müssen Sie die Anweisung und Ihre Verbindung auf folgende Weise schließen:

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

Und wenn Sie eine SELECT-Anweisung abgeben, müssen Sie die Anweisung, die Verbindung und das Resultset auf folgende Weise schließen:

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

Ich habe das gemacht und es hat funktioniert

0
Brayan Escobedo

Die beleidigenden Zeilen sind folgende:

MaxConnections=90
InitialConnections=80

Sie können die Werte erhöhen, um mehr Verbindungen zuzulassen.

0
Delan Azabani