Connection pooling riusa un piccolo insieme di connessioni al database su molte richieste client, invece di aprire una nuova connessione per ogni richiesta. Le connessioni PostgreSQL sono costose (ognuna è un processo separato che utilizza memoria significativa), quindi il pooling è essenziale per la performance e la scalabilità sotto carico. PgBouncer è lo standard pooler.
Il problema: le connessioni PostgreSQL sono costose
Each PostgreSQL connection = a separate OS PROCESS, using ~5-10MB of memory.
✗ Opening a connection has overhead (process creation, auth, setup)
✗ Many connections (e.g. 1000s from a busy app) → huge memory use, contention
✗ Postgres has a max_connections limit (often ~100); exceeding it = errors
→ Opening/closing a connection per request, or holding thousands open, doesn't scale.
