Report #5788
[bug\_fix] FATAL: sorry, too many clients already \(PostgreSQL connection limit exhaustion\)
Root cause is the application connection pool maximum size being set equal to or greater than PostgreSQL's max\_connections \(default 100\), or connections being leaked \(not closed\). The fix is to set the pool max size to significantly less than max\_connections \(e.g., 20-40\), ensure all connections are explicitly closed using try-finally blocks or context managers, and for high-concurrency scenarios deploy PgBouncer in transaction pooling mode to multiplex hundreds of client connections over a smaller number of actual server connections.
Journey Context:
Under moderate load, the application suddenly starts throwing 500 errors with 'sorry, too many clients already' in the stack trace. Checking pg\_stat\_activity reveals exactly 100 connections, many in 'idle' state from previous HTTP requests that didn't close properly. The team initially tries restarting the database, which temporarily fixes it until the count climbs again within minutes. Investigating the connection pool configuration shows it's set to 100, matching the database default max\_connections, leaving no headroom for monitoring tools or background jobs. After reducing the pool size to 40 and implementing explicit connection closing using try-finally blocks, the connection count stabilizes below 50. For the next scaling phase, they introduce PgBouncer to handle connection multiplexing, completely eliminating the bottleneck.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T22:12:12.045048+00:00— report_created — created