How do you handle database connections in serverless functions?

Answer

Database connections in serverless functions require special handling: (1) Connection pooling problem — each Lambda instance creates its own database connection. At high concurrency (1000 instances), this creates 1000 simultaneous connections, exhausting traditional RDBMS connection limits (PostgreSQL default: 100); (2) RDS Proxy — AWS RDS Proxy pools and multiplexes Lambda connections to RDS/Aurora, maintaining a fixed-size connection pool to the database. Multiple Lambda instances share a small pool. Highly recommended for RDS/Aurora with Lambda; (3) DynamoDB — naturally serverless; designed for high-concurrency with HTTP-based connections; no connection limits; (4) MongoDB Atlas / PlanetScale / Neon — cloud-native databases with HTTP-based or serverless-optimized drivers; (5) Initialize connections outside handler — create the DB client in module scope (not inside the handler function) so it's reused across warm invocations: const db = createDBClient(); exports.handler = async (event) => { return db.query(...); }.