Connection Pool
Bağlantı Havuzu
- Okunuşu
- kınekşın pul
Kısaca
Connection pool, bir uygulamanın istekler arasında yeniden kullandığı açık veritabanı bağlantıları önbelleğidir; her seferinde bağlantı açma maliyetini önler.
Connection pool nedir?
Connection pool, bir uygulamanın önceden açtığı ve yeniden kullanıma hazır tuttuğu bir veritabanı bağlantıları kümesidir. Kodun bir sorgu çalıştırması gerektiğinde havuzdan bir bağlantı ödünç alır, kullanır ve kapatmak yerine geri verir. Sonraki istek de aynı bağlantıyı hemen kullanabilir.
Bir veritabanı bağlantısı açmak pahalıdır: ağ gidiş-dönüşleri, çoğu zaman bir TLS el sıkışması, kimlik doğrulama ve her oturum için veritabanı sunucusunda bellek gerektirir. Havuz bu maliyeti bir kez öder ve bağlantıları birçok istek arasında paylaştırır. En büyük boyut, en az boşta bağlantı sayısı ve tüm bağlantılar meşgulken bir isteğin ne kadar bekleyeceğine dair zaman aşımı gibi ayarlarla yapılandırılır.
Bir bisiklet istasyonundaki paylaşımlı bisikletleri düşünün: her yolculuk için yeni bir bisiklet yapıp sonunda atmak yerine, sürücüler birini alır, biner ve bir sonraki kişi için geri koyar. Connection pool'lar çoğu veritabanı sürücüsünde ve ORM'de yerleşiktir; bağımsız havuzlama proxy'leri de birçok uygulama sunucusu ile veritabanı arasında durabilir. Aksi takdirde veritabanını bağlantılara boğacak çok sayıda kısa ömürlü örnek başlatabilen serverless fonksiyonlar için özellikle önemlidirler.
Yaygın bir yanılgı, daha büyük havuzun her zaman daha hızlı olduğudur. Her veritabanı yalnızca sınırlı sayıda bağlantıyı verimli işleyebilir; bu yüzden fazla büyük bir havuz her şeyi yavaşlatabilir, fazla küçük olan ise isteklerin sırada beklemesine yol açar. Bir diğer sık hata, kodun bir bağlantıyı ödünç alıp hiç geri vermediği ve havuz kuruyup uygulama yanıt vermeyi bırakana kadar süren bağlantı sızıntısıdır (connection leak).
Önemli noktalar
- Havuz, veritabanı bağlantılarını açık tutar ve istekler arasında yeniden kullanır.
- Her sorgu için yeni bir bağlantının yavaş kurulumundan kaçınır.
- Temel ayarlar en büyük boyut, boşta bağlantılar ve bekleme zaman aşımıdır.
- Bağlantıları her zaman havuza geri verin, yoksa sızarlar.
- Büyük her zaman iyi değildir; çünkü veritabanı yalnızca belirli sayıda bağlantıyı kaldırabilir.
Örnek
import pg from "pg";
// Create one pool when the app starts and share it everywhere
const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
max: 10, // at most 10 open connections
idleTimeoutMillis: 30000, // close connections idle for 30 seconds
connectionTimeoutMillis: 2000, // give up if no connection is free in 2 seconds
});
// pool.query borrows a connection and returns it automatically
const { rows } = await pool.query("SELECT * FROM users WHERE id = $1", [42]);
console.log(rows[0]);Sık sorulan sorular
Neden connection pool kullanılır?
Her istek için yeni bir veritabanı bağlantısı açmak gecikme ekler ve veritabanına ekstra yük bindirir. Küçük bir açık bağlantı kümesini yeniden kullanmak sorguların daha hızlı başlamasını sağlar ve bağlantı sayısını kontrol altında tutar.
Connection pool ne kadar büyük olmalı?
Genellikle insanların beklediğinden küçük: veritabanı sunucusundaki CPU çekirdeği başına birkaç bağlantıyla başlayın, sonra yük testleriyle ayarlayın. Tüm uygulama örnekleri genelindeki toplamın veritabanının bağlantı sınırının altında kalması gerektiğini unutmayın.
Havuzdaki tüm bağlantılar meşgulken ne olur?
Yeni istekler bir bağlantı geri verilene kadar bir kuyrukta bekler. Yapılandırılan zaman aşımından önce hiçbiri boşalmazsa istek bir hatayla başarısız olur; bu çoğu zaman yavaş sorguların ya da bir bağlantı sızıntısının işaretidir.
İlgili sayfalar
- VeritabanıVeritabanları, s. 37Veritabanı, bilgisayarda düzenli biçimde saklanan ve uygulamaların verimlice kaydedip arayıp güncelleyebildiği, bir yazılımla yönetilen veri topluluğudur.
- ORMVeritabanları, s. 24ORM, veritabanı tablolarını programlama dilinizdeki nesnelere eşleyen ve ham SQL yerine kodla veri okuyup yazmanızı sağlayan bir kütüphanedir.
- ServerlessDevOps ve Bulut, s. 46Serverless, sağlayıcının kodu talep üzerine çalıştırıp sunucuları yönettiği, otomatik ölçeklediği ve yalnızca gerçek kullanıma ücret aldığı bulut modelidir.
- GecikmeAğlar, s. 9Gecikme, bir istek ile yanıtın başlaması arasında geçen süredir; genellikle milisaniyeyle ölçülür ve bir uygulamanın ne kadar hızlı hissettirdiğini belirler.
- Yük TestiTest ve Kalite, s. 36Yük testi, bir sistemin beklenen trafik altında nasıl davrandığını ölçmek için aynı anda çok sayıda kullanıcıyı ya da isteği simüle eden performans testidir.
- TransactionVeritabanları, s. 36Transaction, tek bir bütün olarak başarılı ya da başarısız olan veritabanı işlemleri grubudur; böylece veri asla yarım kalmış, tutarsız bir durumda bırakılmaz.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin