Connection pooling nedir? Pool boyutunu nasıl belirlersiniz?
Cevap
Connection pooling, veritabanı bağlantılarını her istekte açıp kapatmak yerine önceden açılmış bağlantılardan oluşan bir havuzda tutup yeniden kullanmaktır. Yeni bir bağlantı açmak TCP + TLS el sıkışması, kimlik doğrulama ve PostgreSQL'de yeni bir backend process demektir; bu milisaniyeler sürer ve DB kaynaklarını tüketir.
Nasıl çalışır?
- Uygulama havuzdan bağlantı ister (
borrow). - Sorguyu çalıştırır.
- Bağlantıyı kapatmaz, havuza geri verir.
- Boş bağlantı yoksa istek
connectionTimeoutsüresince bekler, sonra hata alır.
Örnekler: Java'da HikariCP (Spring Boot varsayılanı), .NET'te ADO.NET'in yerleşik pool'u, Node.js'te pg.Pool, Python'da SQLAlchemy QueuePool. Veritabanı tarafında PgBouncer gibi harici pooler'lar da kullanılır.
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 10
connection-timeout: 3000 # ms
max-lifetime: 1800000 # DB/proxy timeout'undan kısa olmalıPool boyutu
"Daha büyük pool daha hızlıdır" yanlıştır. DB'nin aynı anda verimli işleyebileceği sorgu sayısı CPU ve disk ile sınırlıdır; fazlası context switch ve kilit çekişmesi yaratır. HikariCP'nin başlangıç formülü:
pool_size = (cpu_core_sayisi * 2) + efektif_disk_sayisiToplam bağlantı hesabı
Asıl sınır toplamdır: pod sayısı x pod başına pool DB'nin max_connections değerini aşmamalı. 20 pod x 20 bağlantı = 400 bağlantı, çoğu PostgreSQL kurulumu için fazladır. Bu durumda pod başına pool küçültülür veya PgBouncer (transaction mode) eklenir.
Sık sorunlar
- Bağlantıyı geri vermemek (connection leak):
try-with-resources/usingkullanın; HikariCPleakDetectionThresholdile tespit eder. - Transaction içinde uzun süren dış HTTP çağrıları bağlantıyı gereksiz tutar.
İlgili Veritabanı & SQL soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.