Connection pooling reutiliza um pequeno conjunto de conexões de banco de dados em muitas requisições de clientes, em vez de abrir uma nova conexão por requisição. Conexões PostgreSQL são caras (cada uma é um processo separado usando memória significativa), então o pooling é essencial para performance e escalabilidade sob carga. PgBouncer é o pooler padrão.
O problema: conexões PostgreSQL são caras
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.
