Merhabalar.Daha önceki vakitlerde yazmış olduğum bir makaleyi, sizlerle de paylaşmak istedim.Bir nebze yararlı olabildiyse ne mutlu diyelim ve konumuza giriş yapalım.ADO.NET Connection Pooling – Bağlantı Havuzu(veritabanı olarak SQLServer kullanılacaktır.)GİRİŞ
Veritabanı ile olan işlerimiz için .NET teknolojilerinden ADO.NET ‘i kullanıyoruz.ADO.NET Microsoft SQL Server, OLEDB gibi çeşitli veritabanı uygulamalarını uygulamalarımıza bağlamak için önemli bir konuma sahip. Bunun yanında yazılım geliştiriciler için öncelik, bu gibi uygulamaların performans planlı olmasıdır.Yani, uygulamanın çalışma mantığından, veritabanı bağlantılarına kadar minimum sistem kaynaklarını kullanmak ve olası felaket senaryolarını (ya da komplo teorileri) göz önünde bulundurarak bu uygulamaları geliştirmektir.Biz bu makelemizde, veritabanı bağlantı teknolojimiz ADO.NET’in bizlere sağladığı Connection Pool(ing) – Bağlantı Havuzu ‘nun çalışma mantığını, özelliklerini ve uygulama üzerindeki çalışmasını inceliyor olacağız.Connection Pooling Ne işe yarar? & Nasıl Çalışır?
Adındaki “pool ” kelimesinin Türkçe karşılığı havuzdur.Teknik açıdan “havuz” kelimesinin karşılığı ise bir çok bileşenin, eklentinin veyahut bir çok özelliğin bir arada tutulması diyebiliriz.Connection Pool – Bağlantı Havuzu ise yine isminden anlaşılacağı gibi bağlantılarımızın havuzlandığı bir özelliktir.Ve bu özellik yazılım kısmından daha çok veritabanı kısmını ilgilendirir.Peki bu havuzlama özelliği ne işe yarar?SQL Server kendisine gelip bağlantı kuran uygulamanın bağlantı cümleciğine göre (connection string) bir havuz oluşturur ve bağlantıyı da bu havuza ekler.Şayet bağlantı için gelen bu bağlantı cümleciği ile tekrar bağlantı isteği yaparsa SQL Server bu havuzdan uygun bağlantıyı uygulamanın kullanımına sunar, eğer uygun bir bağlantı bulunmuyorsa SQL Server yeni bir bağlantı oluşturur ve bu bağlantıyı da havuza bağlar.Örnek olarak 3 Connection açalım.(Oluşan havuzları Performans İzleme Aracı “perfmon.exe” ile görebiliriz. “.NET CLR DATA” Sayacı ekleyerek yapabilirsiniz.)Örnek kodlarımız;

f.g.1
f.g.1

Connection Pooling sayesinde bağlantılar havuzlarına eklenecek ve aynı Connection String ile gelen talebe uygun bağlantı hali hazırda var ise o havuza gelen bağlantıyı dahil edecek.Performans özelliğini buradan da anlayabiliyoruz fakat daha iyi kavrayabilmek adına örnek uygulama üzerinde perfomansımızı test edelim.Connection Pooling İçin Örnek Uygulama
Uygulamamızda 2 adet metod Main metodu içerisinde çağrılacak.Bu iki metottan biri Pooling özelliğinin açık olduğu durumu gösterecek, diğeri ise kapalı olduğu durumu.Ve ikisi arasındaki işlem performansını zaman sayacı ile ölçeceğiz.Uygulamada bağlantı sayısı “1453” olarak seçilecek ve bu bağlantılar bir döngü ile sağlanacaktır.NOT 1: Pooling özelliği default olarak TRUE yani açık olarak gelir.using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SqlClient;namespace ConnectionPoolingTest{class Program{static void Main(string[] args){Acik();Kapali();Console.ReadLine();}static void Acik(){SqlConnection baglan1 = new SqlConnection();baglan1.ConnectionString = “Data Source=SERHATX\SQLSERHAT; Initial Catalog=Northwind; Integrated Security=True”;DateTime basla = DateTime.Now;for (int i = 0; i < 1453; i++){baglan1.Open();baglan1.Close();}DateTime bitir = DateTime.Now;TimeSpan gecenSure = basla - bitir;Console.WriteLine("Pooling açık iken geçen süre: {0}", gecenSure.TotalSeconds);}static void Kapali(){SqlConnection baglan1 = new SqlConnection();baglan1.ConnectionString = "Data Source=SERHATX\SQLSERHAT; Initial Catalog=Northwind; Integrated Security=True; Pooling=False";DateTime basla = DateTime.Now;for (int i = 0; i < 1453; i++){baglan1.Open();baglan1.Close();}DateTime bitir = DateTime.Now;TimeSpan gecenSure = basla - bitir;Console.WriteLine("Pooling kapalı iken geçen süre: {0}", gecenSure.TotalSeconds);}}}
Uygulama sonucunun ekran çıktısı ise aşağıdadır.

f.g.2
f.g.2

Açık ve Kapalı metotlarının çalışmasından sonraki durum ortada.Yalnız bu durum çok kullanıcılı yapılarda daha bir avantaj olmasına karşın çok az kullanımlarda bir dezavantaj olabilir.Bu yüzden 1453 defa bağlantı denedik.Connection Pooling İçin Parametreler ve Ekstra Parametreler
Parametreler
Şu ana kadar Pooling için sadece FALSE değerini kullandık.Bunun yanısıra bir kaç parametremiz daha mevcut.Bunlar;MAX POOL SIZEDefault değeri 100′ dür – Havuz içerisinde bulunabilecek en fazla bağlantı sayısını belirlerMIN POOL SIZEHavuz içerisinde bulunabilecek en düşük bağlantı sayısını belirler.Bağlantılar boşta olsa dahi bu değerin altına düşmezler.POOLINGDefault olarak TRUE değeri atanmıştır.False olduğu zaman Pooling özelliği kapanmış olur.olarak sıralanabilir.Örnek bir Connection String yazacak olursak;cnnStrng=”Data Source=SERHATX\SQLSERHAT; Initial Catalog=Northwind; Integrated Security=True; Min Pool Size= 10; Max Pool Size= 250″;
şeklinde değerler atayıp, SQL Server Query Editöründe Saklı Yordamlar içinde WHO komutunu çalıştırdığımızda, havuza ait olan 10 bağlantıyı görebiliriz.

f.g.3
f.g.3

Ekstra Parametreler
Bunların dışında Connection Pooling için yazabileceğimiz diğer parametreler ise şöyle sıralanabilir;Connection LifetimeConnection ResetConnection TimeoutIncr Pool SizeDecr Pool SizeSonuç
Bu makale ile birlikte ADO.NET Connection Pooling – Bağlantı Havuzu özelliğinin mantığı, nasıl çalıştığı ve uygulama üzerindeki kullanımını öğrenmiş olduk.Bir başka makalemizde görüşmek üzere.Bol kodlu ve performanslı günler dilerim (:ConnectionPoolingTest.rar