12 - Connection Pooling & Performance
Why Connection Pooling?
Database connections are expensive to create. Connection pooling reuses connections instead of creating new ones for each request.
Plain text
┌─────────────────────────────────────────────────────────────┐
│ Without Connection Pooling │
├─────────────────────────────────────────────────────────────┤
│ │
│ Request 1: │
│ App ──► Create Connection ──► Query ──► Close │
│ Time: 50ms + 5ms + 20ms + 5ms = 80ms │
│ │
│ Request 2: │
│ App ──► Create Connection ──► Query ──► Close │
│ Time: 50ms + 5ms + 20ms + 5ms = 80ms │
│ │
│ Problems: │
│ - 50ms connection overhead per request │
│ - Memory pressure (each connection uses RAM) │
│ - Connection limits (PostgreSQL: ~100 max) │
│ - TCP handshake, SSL negotiation, auth every time │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ With Connection Pooling │
├─────────────────────────────────────────────────────────────┤
│ │
│ Startup: │
│ Create 10 connections (500ms one-time cost) │
│ │
│ ┌───────────────────────────────────────────┐ │
│ │ Connection Pool │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │ C1 │ │ C2 │ │ C3 │ │ C4 │ │ C5 │ │ │
│ │ │ C6 │ │ C7 │ │ C8 │ │ C9 │ │ C10 │ │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │ │
│ └───────────────────────────────────────────┘ │
│ │
│ Request 1: │
│ App ──► Borrow C1 ──► Query ──► Return C1 │
│ Time: 1ms + 20ms + 0ms = 21ms │
│ │
│ Request 2 (concurrent): │
│ App ──► Borrow C2 ──► Query ──► Return C2 │
│ Time: 1ms + 20ms + 0ms = 21ms │
│ │
│ Savings: 80ms → 21ms (4x faster!) │
│ │
└─────────────────────────────────────────────────────────────┘