Connection pooling ponownie wykorzystuje mały zestaw połączeń bazodanowych dla wielu żądań klientów, zamiast otwierać nowe połączenie dla każdego żądania. Połączenia PostgreSQL są droższe (każde to oddzielny proces zużywający znaczną ilość pamięci), dlatego pooling jest niezbędny dla wydajności i skalowalności pod obciążeniem. PgBouncer jest standardowym poolerem.
Problem: połączenia PostgreSQL są drogie
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.
