If you are seeing the error FATAL: sorry, too many clients already or FATAL: too many connections for role "username", your PostgreSQL instance has hit its limit of concurrent connections.
This usually happens when:
Your application isn't closing database connections properly.
You have a sudden spike in traffic.
A connection pooler (like PgBouncer) isn't configured.
Step 1: Check Current Connection Usage
Before changing any settings, you need to see who is using the connections. Run this query to get a breakdown of active vs. idle sessions:
SELECT count(*), state
FROM pg_stat_activity
GROUP BY state;
If you see a high number of "idle" connections, your application is likely "leaking" connections (opening them but never closing them).
Step 2: Emergency Fix (Kill Idle Connections)
If your production site is down because of this error, you can manually terminate idle sessions to free up slots immediately:
-- This kills all idle connections older than 5 minutes
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle'
AND state_change < current_timestamp - interval '5 minutes';
Step 3: Increase max_connections (The Configuration Fix)
The default limit in PostgreSQL is often 100. If your hardware has enough RAM, you can increase this.
Find your config file:
SHOW config_file;Open
postgresql.confand find themax_connectionssetting.Change it to a higher value (e.g.,
200or500).Restart PostgreSQL for changes to take effect.
Warning: Every connection consumes memory (roughly 5-10MB). If you set this too high, you might run the entire server out of RAM (OOM).
Step 4: The Professional Solution (Connection Pooling)
Increasing max_connections is a temporary fix. For a production-grade setup, you should use PgBouncer.
Instead of your application connecting directly to Postgres, it connects to PgBouncer. PgBouncer keeps a small pool of real connections open to the database and rotates them among hundreds of incoming requests.
Sample pgbouncer.ini configuration:
[databases]
mydatabase = host=127.0.0.1 port=5432 dbname=mydatabase
[pgbouncer]
listen_port = 6432
auth_type = md5
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20
Summary Checklist
Audit your code: Ensure every
db.connect()has a correspondingdb.close().Monitor: Set up alerts for when connections exceed 80% of
max_connections.Scale: Use a connection pooler like PgBouncer or
pg_poolif you have more than 100 active users.
