Connection Pooling Guide
Why Connection Pooling Matters
Creating database connections is expensive: TCP handshake, SSL negotiation, and authentication add 7-35ms per connection. Connection pooling reuses established connections.
How Pools Work
A pool maintains a set of open connections. When a thread requests one, an idle connection is returned immediately. If all are busy, the thread waits.
Pool Configuration
| Parameter | Recommended | |-----------|-------------| | maxSize | 10-20 per CPU core | | connectionTimeout | 30000ms | | maxLifetime | 1800000ms (30min) |
HikariCP (Java)
spring.datasource.hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
max-lifetime: 1800000
PgBouncer (PostgreSQL)
[pgbouncer]
pool_mode = transaction
default_pool_size = 25
max_client_conn = 100
Pgbouncer sits between application and database. Transaction mode returns connections to pool after each transaction.
Sizing Formula
pool_size = (core_count * 2) + effective_spindle_count
For 8 CPU cores with SSD: 17 connections. More connections causes context switching overhead.
Monitoring
SELECT state, count(*) FROM pg_stat_activity
WHERE backend_type = 'client backend' GROUP BY state;
Monitor for idle-in-transaction connections and pool exhaustion.
Conclusion
Size pools based on CPU cores, not concurrent users. Use PgBouncer for high-scale PostgreSQL deployments. Set timeouts and max lifetimes. Monitor pool usage and connection leaks.