Connection Pooling
Vercel menggunakan serverless functions — setiap request bisa membuat koneksi database baru. Tanpa pooling, ini bisa menyebabkan terlalu banyak koneksi ke database.
PlanetScale sudah menyediakan PgBouncer (connection pooler) secara bawaan. Kamu cukup menggunakan URL yang tepat.
Kenapa Perlu Connection Pooling?
Tanpa Pooling:
Request 1 → buka koneksi baru → selesai → tutup
Request 2 → buka koneksi baru → selesai → tutup
Request 3 → buka koneksi baru → selesai → tutup
↑ Boros, bisa melebihi batas koneksi
Dengan PgBouncer:
Request 1,2,3 → PgBouncer → pakai koneksi yang sudah ada
↑ Efisien, hemat resource
Cara Menggunakan Pooled Connection
Tambahkan ?pgbouncer=true ke connection string:
# Direct (untuk migrations/studio)
DATABASE_URL="postgresql://role:pass@host/db?sslmode=require"
# Pooled (untuk production Vercel)
DATABASE_URL="postgresql://role:pass@host/db?sslmode=require&pgbouncer=true"
Rekomendasi untuk Project Cekolah
| Environment | Tipe Connection | Alasan |
|---|
| Vercel Production | Pooled | Serverless, banyak request concurrent |
| Vercel Preview | Pooled | Sama seperti production |
| Development lokal | Direct | bun dev punya koneksi persistent |
| Migrations | Direct | PgBouncer tidak support prepared statements yang dibutuhkan migrations |
| Drizzle Studio | Direct | Butuh koneksi langsung |
Jangan gunakan pooled connection untuk bun run db:migrate. Drizzle migrations tidak kompatibel dengan PgBouncer dalam mode transaction pooling.
Tips
- PlanetScale plan gratis memiliki batas koneksi. Selalu gunakan pooled connection di production.
- Batas koneksi Drizzle di project ini: 2 untuk production, 10 untuk development.
- Jika dapat error
too many connections, periksa apakah kamu menggunakan pooled URL.