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 so etwas ausgeführt: Connection conn = myconn.Open();
innerhalb einer Schleife und vergessen zu laufen conn.close();
. 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 für jede 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 Müll gesammelt hat, wird Ihre Verbindung freigegeben.
Führen Sie diese SQL aus, um die maximal zulässigen Postgresql-Verbindungen anzuzeigen:
show max_connections;
Der Standardwert ist 100. PostgreSQL auf guter Hardware kann 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 verringern.
Schauen Sie sich genau an, wer / was / wann / wo Ihre Verbindungen offen hält:
SELECT * FROM pg_stat_activity;
Die Anzahl der derzeit verwendeten Verbindungen ist:
SELECT COUNT(*) from pg_stat_activity;
Debugging-Strategie
Sie können den Programmen, die möglicherweise die Verbindungen nicht freigeben, unterschiedliche Benutzernamen / Kennwörter geben, um herauszufinden, um welche es sich handelt, und dann in pg_stat_activity nachsehen, welche nicht nach sich selbst bereinigt.
Führen Sie eine vollständige Ablaufverfolgung des Ausnahmestapels durch, wenn die Verbindungen nicht erstellt werden konnten, und folgen Sie dem Code bis zu dem Ort, an dem Sie eine neue erstellen Connection
. Stellen Sie sicher, dass jede Codezeile, in der Sie eine Verbindung erstellen, mit einem endetconnection.close();
So stellen Sie die max_connections höher ein:
max_connections in der postgresql.conf legt die maximale Anzahl gleichzeitiger Verbindungen zum Datenbankserver fest.
- Suchen Sie zuerst Ihre postgresql.conf-Datei
- Wenn Sie nicht wissen, wo es sich befindet, fragen Sie die Datenbank mit dem SQL ab:
SHOW config_file;
- Meins ist in:
/var/lib/pgsql/data/postgresql.conf
- Melden Sie sich als root an und bearbeiten Sie diese Datei.
- Suchen Sie nach der Zeichenfolge: "max_connections".
- Sie sehen eine Zeile mit der Aufschrift
max_connections=100
.
- Stellen Sie diese Zahl größer ein und überprüfen Sie das Limit für Ihre Postgresql-Version.
- 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 verstehe den Wert 8388607
, theoretisch ist das der höchste Wert , den Sie haben dürfen, aber dann kann ein außer Kontrolle geratener Prozess Tausende von Verbindungen verschlingen, und überraschenderweise reagiert Ihre Datenbank bis zum Neustart nicht. Wenn Sie eine vernünftige max_connections wie 100 hätten. Dem fehlerhaften Programm würde eine neue Verbindung verweigert.
Die MaxConnections und InitialConnections müssen nicht erhöht werden. Schließen Sie einfach Ihre Verbindungen nach der Arbeit. Zum Beispiel, wenn Sie eine Verbindung herstellen:
Nach Ihrer Arbeit schließen Sie die Verbindung:
quelle
Die beleidigenden Zeilen sind die folgenden:
Sie können die Werte erhöhen, um mehr Verbindungen zu ermöglichen.
quelle
Sie müssen alle Ihre Verbindungen schließen, zum Beispiel: Wenn Sie eine INSERT INTO-Anweisung erstellen, müssen Sie die Anweisung und Ihre Verbindung auf folgende Weise schließen:
Und wenn Sie eine SELECT-Anweisung abgeben, müssen Sie die Anweisung, den Zusammenhang und die Ergebnismenge folgendermaßen schließen:
Ich habe das gemacht und es hat funktioniert
quelle