Caching (Önbellekleme) - II

Abdullah Tarık Güney tarafından yazıldı

Merhabalar, bu ikinci makalemizde ise sizler ile beraber kaldığımız yerden devam ediyoruz. İlk başta anlattığımız ama örnek vermediğimiz Fragment cahcing ile devam edelim. Kısaca özetlemek gerekirse bu cachleme yöntemi parça parça cachleme olarakta türkçe bir karşılık getirebiliriz. Bu yöntemde amaç sayfamızın belli bölümlerini önbellekleme yapmak ve böylece istediğimiz doğrultuda performans artışına gitmektir. Unutmadan söylemek gerekki burada ki ince nokta user controls ( kullanıcı kontrolleri ) kullanmak. Tabi ki bu yöntemi uygulama sırasından tek user controls kullanılacak diye bir olay aynı şekilde subsitution kontrolunu kullanarak ta yapabiliriz.

Bu özetlerden sonra konumuza başlayalım. Önceki makalemizde Directive bölümüne cachleme işlemi yapmak için hangi directive leri yazdığımızı görmüştük şimdi bunlardan yola çıkarak çok basit ve anlaşılır örnekler ile konumuzu inceleyelim.(Unutmadan eğer user controls hakkında bilginiz yoksa bu makaleyi okumada önce ilk başta user controls konusunu incelemenizi şiddetle tavsiye ederim.)

1.)    İlk başta Toplama isimli bir user control ü projenize ekleyiniz ve aşağıdaki tasarimi yapınız

 

2.) Bu tasarımı yaptıktan sonra Kullanıcı Kontrolümüzde Source (kaynak) kısmına gelip şu direktivi ekleyelim sayfamızın üst kısmına

<%@ OutputCache Duration="5" VaryByParam="None" %>

 

2.)    Yukarıda dikkatinizi çeken kısımlardan biri duration yani cache mizin kullanılma süresinini 5 saniye yaptık.

3.)    Şimdi bu oluşturduğumuz Kullanıcı Kontrolunün Toplama isimli tuşun olay yordamına şunu yazın ;

 

protected void btnToplama_Click(object sender, EventArgs e)

{

lblSonuc.Text = (Convert.ToInt16(txtSayi1.Text) + Convert.ToInt16(txtSayi2.Text)).ToString();

}

 

Evet bunları yaptıktan sonra artık iki sayıyı toplayan ve sonucunu bize veren bir kullanıcı kontolümüz olmuş oldu. Şimdi ise yapmamı gereken olay bunu Default.aspx sayfamıza eklemek. Ekledikten sonra cachlemeyi daha iyi farkedebilmek amacıyla Default.aspx sayfamıza bır tane label ekleyin ve Page_Load olayına şu kodları yazın :

 

protected void Page_Load(object sender, EventArgs e)

{

Label1.Text = DateTime.Now.ToLongTimeString();

}

 

 

Evet artık sistemimiz çalışmaya hazırdır ve şimdi derleyiniz. Evet açılan sayfamızda bulunan Kullanıcı Kontrolümüzde sayıları girip Toplama tuşuna basınız. Neler gördünüz ? Tabiki herhangi bişey değişmedi ama Default.aspx sayfasına eklediğiniz Label baktığımzda ise her sayfayı yenilemede değiştiğini göreceksiniz ve 5 saniye sonra ise Kullanıcı Kontrolümüz değişir. Burada önemli noktalardan biri ise Cache in kullanımı sırasında Kullanıcı Kontrolu için yazılan Code-Behind (Toplama.ascx.cs) deki kodun derlenmeyeceğidir. İşte sizde Fragment önbelleklemenin ne kadar kolay olduğunu gördünüz.

 

Peki ben Default.aspx sayfasına koyduğum Label1 kontrolunun içeriğinin Herhangi bir kontrole göre değişmesini isteseydim yani, Default.aspx sayfamda yeni bir cache oluşturulmasını tetikleyici etkenin benim belirlediğim kontrolümün olmasını isteseydim bunu nasıl yapardım ? Bunun için tek yapmanız gereken olay şu :

 

Default.aspx sayfasına bır tane örnek olması amacıyla DropDownList ekleyiniz. Ve EnableAutoPostBack özelliğini true yaptıktan sonra 3-4 tane içine item ekleyiniz yada direk aşağıda bulunan kodu Default.aspx sayfanızın Source kısmına ekleyiniz :

 

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">

<asp:ListItem>Visual C#.NET</asp:ListItem>

<asp:ListItem>ASP.NET</asp:ListItem>

<asp:ListItem>CSharpnedir.com</asp:ListItem>

</asp:DropDownList>

 

Şimdi bunu ekledikten sonra Default.aspx sayfamızda Directive bölümüne şunu eklemeniz gerekecek :

 

<%@ OutputCache Duration="5" VaryByControl="DropDownList1" %>

 

Evet şimdi burada önemli olan nokta VaryByControl ( Kontrole göre değiştir ) özelliği. Burada amacımız DropDownList1 kontrolünün değişimine göre önbellekleme yapmak. ( Tabiki hala önceden eklediğimiz ve güncel zamanı gösteren Label1 kontrolümüz duruyor olması gerekir.) ve sayfamızı derleyelim. İlk başta sayfamızı yenileyelim bakalım zamanı gösteren label kontrolünde herhangi bir değişim oluyo mu? Dikkat ettiyseniz her 5 dakikada bir değişim olduğunu göreceksiniz ve şimdide eklemiş olduğumuz DropDownList1 kontrolümüzün seçili olan indexini değiştirin. Ne oldu ? Tabiki sayfamız önbellekleme zamanının bitmesini beklemeden yeniden bir önbelleği oluşturuldu ve güncel sayfa önümüze geldi. İşte bu şekilde herhani bir kontrole göre de nasıl önbellekleme yapabileceğimizi görmüş olduk.

 

Bu arada değinmeden geçmek istemediğim bölümlerden birisi ise Önceki örneğimizde Kullanıcı Kontrolleri ile çalışırken şöyle bir ifadeninde Kullanıcı Kontrollerinde önbellekle yapma sırasında gözükebileceği :

 

<%@ OutputCache Duration="5" Shared="true" %>

 

Peki buradaki Shared özelliği ne işimize yarıyor. İlka başta adından da anlaşılacağı gibi paylaşılmış manasına gelen bu özellik : aynı kullanıcı kontrolünü birden fazla yerde kullanabilirsiniz ve her farklı sayfa için asp.net bu kullanıcı kontrolünün farklı bir önbelleklenmiş kontrolünü oluşturur. Ama eğer biz böyle bir gereksinime ihtiyaç duymuyorsak ve her sayfa için aynı önbelleklenmiş kullanıcı kontrolünü kullanmak istiyorsak o zaman Share özelliğini true yapmamız sorunumuzu giderecektir.

 

A.tarık güney

Bilgisayar mühendisi

 

Bu arad data cahcing anlatmadım ki o bayağı ileri bir konu onunla alakalı isterseniz video hazırlamam daha iyi olcağını düşünüyorum çünkü veritabani işin işine girdiği yerler var görerek öğrenmek daha etkili olur kanaatindeyim..

 

Teşekkürler..

 

İyi çalışmalar..



MaxiASP.Net - Gelecek Çok .Net - www.maxiasp.net