Connection Pooling nedir ve ne işe yarar?

Bu flood’da uygulama sunucuları ile veri tabanları arasındaki iletişimi optimize hale getirmek için geliştirilen Connection Pooling tekniğini tanıyacağız.

Önceki flood’da uygulama sunucularının veri tabanı gibi üçüncü parti sistemlerle iletişim kurmak için TCP protokolünü kullandığını görmüştük. Bu flood'da ise bu sistemlerle kurulan TCP bağlantılarının nasıl en iyileştirilmiş biçimde kullanıldığını inceleyeceğiz.

İki sistem arasındaki bir TCP bağlantısı Three-Way Handshake denen ve adından da anlaşılacağı üzere toplamda ağ üzerinden üç mesajın gönderilip alındığı bir mekanizma ile kurulur. Uygulama sunucusunun veri tabanına göndereceği her sorguda TCP bağlantısını yeniden oluşturması performans ve verimlilik açısından pek akla yatkın değildir. Kaldı ki bağlantı sağlandıktan sonra uygulama sunucusu ve veri tabanı arasında Authentication (kimlik doğrulama), vb adımların tekrar tekrar yapılması gerekecektir.

Connection Pooling işte tam bu noktada devreye girerek uygulama sunucusu ve veri tabanı arasında TCP bağlantılarından oluşan bir havuz oluşturur. Uygulama sunucusu, veri tabanına yapacağı bir istekten önce TCP bağlantısını baştan kurmak yerine mevcut havuzdan bir bağlantı talep eder ve havuzda boşta bir bağlantı varsa bu bağlantıyı alarak veri tabanına sorgusunu gönderir. Uygulama sunucusunun bağlantıyla işi bittiğinde ise havuz yöneticisi (ki genellikle veri tabanı driver'ı olur) bağlantıyı tekrar kullanılmak üzere havuza bırakır.

Görüleceği üzere uygulama sunucusu Connection Pool'un varlığından habersizdir. Uygulama sunucusunun yeni bağlantı isteği driver tarafından havuzdan boş bir bağlantıyı verme, mevcut bağlantıyı kapatma isteğiyse bağlantıyı havuza bırakma olarak gerçekleştirilir.

Platformdan platforma değişim göstermekle birlikte bağlantı havuzları, veri tabanına yapılacak minimum ve maksimum bağlantı sayısı, kullanılmayan bağlantıların ne kadar süre sonra kapatılacağı gibi parametrelerle ihtiyaca göre yapılandırılabilir. Örnek bir senaryoda, uygulamanızın veri tabanına her an 2 bağlantısının olmasını, bu 2 bağlantı yeterli gelmediğinde 20'ye kadar yeni bağlantılar açılmasını, açılan yeni bağlantılardan 60 saniye boyunca kullanılmayanların ise kapatılmasını sağlayabilirsiniz.

Uygulama sunucusunun veri tabanına yaptığı sorguların anlık olarak çok yükseldiği ve mevcut bağlantıların yetmediği durumlarda, yeni bağlantıların açılıp havuza eklenmesini beklemek performansı olumsuz etkileyebilir. Bu durumlarda minimum bağlantı sayısı yüksek tutulmalıdır.

Veri tabanına yapılan sorguların makul süreler (5ms, 10ms) sürdüğü bir senaryoda bir bağlantı üzerinden saniyede (200, 100) sorgu yapılabilecektir. Veri tabanı üzerinde yapılan toplam sorgu ve uygulama sunucusu sayısı ile havuzdaki minimum bağlantı sayısına karar verilebilir.

Connection Pooling'in performans ve optimizasyonu artırmasına ek olarak bir başka avantajı da uygulama sunucusunun bağlantıyı açıp kapatmayı atladığı dolayısıyla bağlantıları sızdırdığı (Connection Leak) durumlarda veri tabanını kullanılamaz hale gelmekten korumasıdır. Connection Pooling kullanılmadığında uygulama sunucusunun her yeni isteği için veri tabanında bir TCP bağlantısı açılacak, bu bağlantılar kapatılmadıkça veri tabanı sunucusu üzerindeki portlar tükenecek ve veri tabanı başka uygulamalara da cevap veremeyecektir.

Yukarıda anlatılan senaryoda Connection Pooling kullanıldığında ise hatalı çalışan kodu yürüten uygulama sunucusu maksimum bağlantı sayısına ulaştıktan sonra yeni bağlantı açamayacak, kendisi çalışamayacak fakat veri tabanının başka uygulamalar tarafından kullanılmasına engel olamayacaktır. Bu tür durumlarda Connection Leak'e sebep olan uygulama Timeout waiting for connection from pool gibi bir hata ile sızıntı işaretini verecektir. Bu noktada nadir olarak bu hata bağlantılarda bir sızıntı olmadan yoğun kullanıma bağlı olarak da alınabilir.