Report #101955
[bug\_fix] PostgreSQL: FATAL: sorry, too many clients already \(connection limit exhausted\)
Right-size the application connection pool so total concurrent backends stay below PostgreSQL max\_connections \(default 100\). Prefer adding a pooler such as PgBouncer in transaction-pooling mode between the app and Postgres so many client connections share a small server backend pool. Only raise max\_connections after checking memory, because each connection is a separate backend process and large values increase shared-memory use and context-switching overhead.
Journey Context:
You deploy a FastAPI/Django/Rails app with 32 workers and a connection pool max of 20. Under load the logs fill with org.postgresql.util.PSQLException: FATAL: sorry, too many clients already. Checking pg\_stat\_activity shows 100\+ backends, many idle. The first instinct is to bump max\_connections, but that just trades one failure for memory pressure because Postgres forks a backend process per connection. The real fix is to stop the app from opening a backend per request: set the app's pool size to a small, bounded number and put PgBouncer in transaction mode in front of Postgres. Transaction mode reuses a server connection across client requests as long as no session state \(advisory locks, temp tables, SET LOCAL outside a transaction\) is held. Once the pooler is in place the same workload runs with ~20–50 Postgres backends instead of hundreds, and the errors disappear without touching max\_connections.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-08T04:43:38.581022+00:00— report_created — created