Makale Özeti

Asenkron veritabanı işlemlerinin yapılışı. Aykut TAŞDELEN

Makale

ADO.NET 2.0 İle Gelen Yenilikler -3

SQLClient Providerı Üzerinde Yapılan Geliştirme Çalışmaları

Bilindiği gibi .NET Framework, "managed data provider" ismi ile anılan ve veri kaynaklarına erişim için kullanmakta olduğumuz birtakım sınıf kütüphanelerini içermektedir. Sözkonusu providerların ADO.NET 2.0 ile geldikleri nokta incelendiğinde, özellikle SqlClient managed providerına ilişkin çok ciddi bir takım değişikliklerin varolduğu görülecektir. 

SqlClient managed providerındaki gelişimin temel nedeni; SqlServer 2005 (Yukon) in getireceği yeniliklere adapte olabilme zorunluluğudur. Bu managed providerın içerdiği pek çok yenilik, her ne kadar SqlServer 2005 ile ilgili olsa da (MARS, yeni veri tipleri, client failover vs), önceki sürümleri de bağlayan ortak birtakım değişikliklerin olduğu bilinmelidir. Sözgelimi SqlClient managed providerı artık MDAC (Microsoft Data Access Components) teknolojisini kullanmamaktadır.

Asenkron Veri Tabanı İşlemlerinin Yapılışı

Veritabanı uygulamaları geliştirilirken duyulan gereksinimlerden birisi de, veri tabanı işlemlerini asenkron, yani paralel olarak yapabilmektir. Bu gereksinimin altında yatan temel neden; yapılışı görece uzun süren bazı veri tabanı işlemlerinin senkron şekilde çalıştırılmasının uygulamayı (daha doğrusu o t anında çalışan threadi) bloke ediyor olmasıdır. Oysa beklenti; bu tür işlemlerin çalışması devam ediyorken, uygulamanın diğer kısımlarının bloke olmaksızın çalışmaya devam edebilmesidir. Bu noktada veri tabanı erişimi için kullanılan sınıf kütüphanesi, asenkron çalışmayı destekleyecek araçlardan yoksun tasarlanmış ise, programcı işletim sisteminin multithread çalışma mekanizmalarını kullanarak, söz konusu gereksinimi karşılayabilir.

Konuya ADO.NET özelinde bakılırsa, 2.0 dan önceki versiyonların asenkron çalışmayı destekleyen programatik araçlardan yoksun olduğu görülecektir. ADO.NET 2.0 - SqlCommand sınıfı ise, veri tabanı işlemlerinin asenkron şekilde yapılmasını sağlayacak, metotları barındırmaktadır. Bu metotların isimlendirilmesinde -bir tür konvansiyon haline gelen- Begin ve End önekleri kullanılmıştır.

Senkron Asenkron
ExecuteNonQuery BeginExecuteNonQuery, EndExecuteNonQuery
ExecuteReader BeginExecuteReader, EndExecuteReader
ExecuteXmlReader BeginExecuteXmlReader, EndExecuteXmlReader

BeginXxx genel ismi ile kategorize edilen metotlar, başlattıkları asenkron işlem sürecinin durumunu; IAsyncResult arayüzü türünde döndürdükleri referans değeri ile rapor etmektedirler. Bu değer, daha sonra (işlemin sonlandırılması amacı ile) EndXxx genel ismi ile kategorize edilen metotlara parametre olarak geçilmektedir.

Asenkron çalışma özelliği, önemli bir getiri olmasına rağmen bu özelliğin gereksiz yere kullanımından daima kaçınılmalıdır. Asenkron çalışma kararının verilmesinde, ayırıcı tanı; yapılmak istenen işlemin, uygulamanın diğer kısımlarını (sözgelimi kullanıcı arayüzünü) uzun süre bloke edecek şekilde çalışıyor olmasıdır. Ayrıca SqlServer network library üzerinde de bu özelliğin paralelinde bazı geliştirilmeler yapılmıştır. Örneğin stack, asenkron işlemleri destekleyecek hale getirilmiştir.

Örnek : Aşağıdaki örnekte BeginExecuteNonQuery() ve EndExecuteNonQuery() metotlarının kullanımı örneklenmiştir. Güncelleme işlemindeki yavaşlığı simüle edebilmek adına; SQL komutu içerisinde bir WAITFOR deyimi kullanılmıştır.

SqlConnection cnn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;
Initial Catalog=AdventureWorks; Asynchronous Processing= true< /U>");
cnn.Open();

string sSQL = "UPDATE Production.Product SET ReorderPoint = ReorderPoint + 1 " +
"WHERE ReorderPoint Is Not Null;"
+ "WAITFOR DELAY 0:0:3;"
+ "UPDATE Production.Product SET ReorderPoint = ReorderPoint - 1 "
+ "WHERE ReorderPoint Is Not Null";

try
{
    SqlCommand cmd = new SqlCommand(sSQL, cnn);
    IAsyncResult res = cmd.BeginExecuteNonQuery();

    while (!result.IsCompleted)
    {
         Console.WriteLine("İşlem devam ediyor"); 
    } 
    Console.WriteLine("İşlem tamamlandı. Etkilenen kayıt sayısı : ", cmd.EndExecuteNonQuery(res));
}
catch (Exception ex)

     Console.WriteLine("Hata:", ex.Message);
}


Aykut TAŞDELEN

MVP (MS Most Valuable Professional)