Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


ASP.NET Caching (Önbellekleme)

Yazar: ismail aktaş

Kategori: ASP.NET

Eklenme Tarihi: 08.06.2007 07:09:43

Web sayfalarımızın sunucu-istemci arasındaki hızlarını ve geliştirdiğimiz uygulamaların hızlarını yükseltmek amaçlı olarak kullandığımız pek çok işlemden biride önbelleklemedir. Bu sayede sayfalarımızın tamamını ve bir kısmını önbelleğe atarak (Sunucu, İstemci, Proxy, Herhangibir yer) sayfalarımızı
ASP.NET Caching (Önbellekleme)

Merhabalar.
Web sayfalarımızın sunucu-istemci arasındaki hızlarını ve geliştirdiğimiz uygulamaların hızlarını yükseltmek amaçlı olarak kullandığımız pek çok işlemden biride önbelleklemedir.
Bu sayede sayfalarımızın tamamını ve bir kısmını önbelleğe atarak (Sunucu, İstemci, Proxy, Herhangibir yer) sayfalarımızın önbellekten okumasını sağlayabilir ve bu sayede sayfalarımıza hız kazandırabiliriz.
Önbellekleme işlemi genelde fazla değişmeyen sayfalar, sabit kısımlar, kullanıcı kontrolleri gibi yerlerde kullanılır.
ASP.NET ile birlikte önbellekleme işlemleri dahada kolaylaşmış ve ayarlanabilir hale gelmiştir.


ASP.NET teknolojisinde önbellekleme teknikleri üç ana başlık altında toplanmaktadır.
Bunlar ;

1. Output Caching
Sayfa direktifi olarak sayfanın üst kısmına yazılır. Sayfa çıktısının önbelleğe aktarılmasını sağlar.
2. Data Caching
Veritabanından çekilen verilen önbelleğe atılması tekniğidir.
3. Fragment Caching
Sayfanın tamamının değilde bir kısmının önbelleğe atılması işlemidir.
Genelde bu teknik için kullanıcı kontrolü kullanılır.

Sayfanın output caching tekniği ile önbelleğe atılması aslında HTML görüntüsünün içeriğinin bellekte saklanması anlamına gelir.
Şimdi örneklerle önbellekleme tekniklerini inceleyelim.

1. Output Caching
Yeni bir web site projesi oluşturduktan sonra default.aspx sayfamızı aşağıdaki gibi düzenleyelim.

<%@ Page Language="VB" %>

<%@ OutputCache Duration="60" VaryByParam="none"%>

<script runat="server">

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

lblsaat.Text = Date.Now

End Sub

</script>

<html>

<head runat="server">

<title>Output Caching</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:Label ID="lblsaat" runat="server"></asp:Label>

</div>

</form>

</body>

</html>



Sayfamızı bu şekilde değiştirdikten sonra çalıştırdığımızda ekrana o anki saati gösterecektir ve sayfamızı 60 saniye boyunca yenilediğimizde (refresh) hep aynı saati göreceğiz. Bunun nedeni sayfa direktifinde Outputcache i kullanmamız ve süre (Duration) olarak saniye cinsinden 60 değerini vermemizdir.
OutputCache tekniğinde en önemli kısım bence VaryByParam dır.
VaryByParam yazılması zorunlu olan bir özelliktir ve içeriği Querystring yada Session ile değişen sayfalarda önem kazanır.
Eğer sayfaya herhangibir değer gelmiyor ise none değeri verilmelidir.
Somut bir örnek verecek olursak sayfamızın seçilen bir kategorideki ürünleri listeyen bir görevi olduğunu düşünelim.
Bu durumda kategori numarası sayfamıza parametrik olarak gelecektir. Adres barda ortalama şöyle bir adres satırı olacaktır.
http://localhost/caching/urungoster.aspx?kategoriID=5

burda urungoster.aspx sayfasına parametrik olarak gönderilen kategoriID değeri outputcaching tekniğinde kontrol edilebilir.
Bu işlem için outputcache sayfa direktifini şu şekilde değiştirmemiz yeterli olacaktır.

<%@ OutputCache Duration="60" VaryByParam="kategoriID" Location="Any"%>


Bu şekilde değiştirdikten sonra urungoster.aspx sayfası istemci tarafından her istendiğinde kategoriID kontrol edilecek ve eğer gönderilen kategoriID değeri biröncekinin aynısı ise sayfa 60 saniye süresince önbellekten çağırılacaktır, farklı ise sayfa yeniden oluşturulacaktır. VaryByParam kullanım şekillerinden bazıları ;
VaryByParam=”KategoriID” : Sadece bir parametre gönderiliyor ise bu tip yazım kullanılır. VaryByParam=”KategoriID;UrunID” : Noktalı virgül ayracı ile birden fazla parametre yazılabilir. VaryByParam=”*” : Yıldız (*) özel karakteri belirtildiğin gönderilen bütün parametreler işleme tabi tutulur.

Location özelliği için kullanılabilir değerler ;
Location=”Any” : Önbelleklemenin herhangibir yerde yapılacağı anlamına gelir. Varsayılan (default) değerdir.
Location=”Client” : Sayfanın HTML çıktısı kullacı tarafında önbelleklenir.
Location=”Server” : Sayfanın HTML çıktısı sunucu tarafında önbelleklenir.
Location=”None” : İlgili sayfanın herhangibir önbellekleme işlemine uğramayacağı anlamına gelir.
Location=”Downstream” : Sunucu ile istemci arasında bir proxy sunucu var ise önbelleklemenin proxy sunucu üzerinde olması anlamına gelir.

2. Data Caching

Data Caching tekniğinde amaç verileri önbelleğe atmak ve tekrar çağırıldığında hızlı bir şekilde geri getirmektir. Bu nedenle veriler dataset, datatable gibi veri barındıran bir veri objesinde bulunmalıdır. Somut bir örnek verecek olursak, App_Data klasöründeki db.mdb adında Access veritabanımız olduğunu ve bu veritabanı içinde de tblkisiler adında bir tablomuz olduğunu varsayalım. Buraya kadar bahsettiklerimizden yola çıkarak Aşağıdaki sayfayı Data Caching tekniği ile yapılandıralım. Oluşan sayfanın kodu şu şekilde olacaktır.

<%@ Page Language="VB" %>

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.oledb" %>

<script runat="server">

Dim connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & HttpContext.Current.Server.MapPath("App_Data/db.mdb")

Dim objconn As New OleDbConnection(connStr)

Dim objda As New OleDbDataAdapter("Select * from tblkisiler", objconn)

Dim objdt As New DataTable

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If (IsNothing(Cache("kisiler"))) Then

DataDoldur()

Cache.Insert("kisiler", objdt, Nothing, DateTime.Now.AddMinutes(10), Caching.Cache.NoSlidingExpiration)

lblsonuc.Text = "Veriler DB den yüklendi. Cache e aktarıldı."

' Veriler 10 dakika süreyle ara bellekte saklanacak daha sonra ise silinecektir.

Else

lblsonuc.Text = "Veriler Cache ten yüklendi."

End If

GridView1.DataSource = Cache("kisiler")

GridView1.DataBind()

End Sub

Sub DataDoldur()

objconn.Open()

objda.Fill(objdt) '<- datayı datatable a doldur...

objda.Dispose()

objconn.Close()

objconn.Dispose()

End Sub

</script>

<html>

<head runat="server">

<title>Untitled Page</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:Label runat="server" ID="lblsonuc" ForeColor="red"></asp:Label>

<br />

<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">

<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />

<RowStyle BackColor="#EFF3FB" />

<EditRowStyle BackColor="#2461BF" />

<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />

<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />

<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />

<AlternatingRowStyle BackColor="White" />

</asp:GridView>

</div>

</form>

</body>

</html>


Yukarıdaki kodlarda önemli olabilecek satır şudur,
Cache.Insert("kisiler", objdt, Nothing, DateTime.Now.AddMinutes(10), Caching.Cache.NoSlidingExpiration)
Bu satırın açılımı şu şekildedir.
Cache.Insert(string key,object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)

Bu satıra göre veriler yani objdt datatable nesnesi, kisiler adında 10 dakika süreyle önbellekte saklanılacaktır.
Sayfamızı ilk kez çalıştırdığımızda alacağımız ekran görüntüsü şu şekilde olacaktır.


Sayfayı refresh yapmamız durumunda ise ekran görüntüsü şu şekilde değişecektir.



Evet, görüldüğü üzere sayfa tekrar çağırıldığında veriler bu kez yeniden oluşturulmayıp önbellekten getirildi. Bu, uygulamamıza hız kazandırmış oldu.
Bu noktada en önemli soru sanırım, değişen verilerin önbelleğe nasıl yansıyacağı olacaktır.
Bunun için CacheDependency mekanizmasını CacheDependency(Server.MapPath("kisiler.xml")) şeklinde kullanmak ve verileri bir veri kaynağına bağlı olarak önbelleğe aktarmak doğru olacaktır.

3. Fragment Caching

Sayfanın tamamının değilde bir bölümünün önbelleğe aktarılması için kullanılan tekniktir.
Bu tekniği açıklayacak en iyi örnek uygulamamıza yeni bir kullanıcı kontrolü eklemek ve o kullanıcı kontrolüne sayfa direktifi olarak aynı Output Caching tekniğinde olduğu gibi Output Cache direktifi eklemektir.
Kimi zamanda küçük çapta birtakım verileri, değerleri önbellekte tutmak isteyebiliriz.
Bu işlem için aşağıdaki Default2.aspx sayfası işimizi görecektir.

<%@ Page Language="VB" %>

<script runat="server">

Protected Sub btnyaz_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnyaz.Click

Dim stryaz As String = txtyaz.Text

Cache.Insert("CacheYazisi", stryaz)

End Sub

Protected Sub btnoku_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnoku.Click

If (Not IsNothing(Cache("CacheYazisi"))) Then

lbloku.Text = Cache.Item("CacheYazisi").ToString

Else

lbloku.Text = "Cache Boş."

End If

End Sub

Protected Sub btnsil_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnsil.Click

If (Not IsNothing(Cache("CacheYazisi"))) Then

Cache.Remove("CacheYazisi")

lblsil.Text = "Eklenen Value Cache ten Silindi."

Else

lblsil.Text = "Cache Zaten Boş."

End If

End Sub

</script>

<html>

<head runat="server">

<title>Caching</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<strong>

Cache'e Ekle:</strong><br /><asp:Button ID="btnyaz" Text=" Ekle " runat="server" />

<asp:TextBox runat="server" ID="txtyaz" Width="107px"></asp:TextBox>

<hr color="gainsboro" />

<strong>

Cache'ten Oku:</strong><br /><asp:Button ID="btnoku" Text=" Oku " runat="server" />

<asp:label runat="server" ID="lbloku"></asp:label>

<hr color="gainsboro" />

<strong>

Cache'ten Sil:</strong><br /><asp:Button ID="btnsil" Text=" Sil " runat="server" />

<asp:label runat="server" ID="lblsil"></asp:label>

</div>

</form>

</body>

</html>



Bu sayfanın ilk ekran görüntüsü şu şekilde olacaktır.



Bu sayfada textbox a bir şeyler yazıp Ekle butonuna bastığımızda CacheYazisi adında içerik değeri textbox a yazdığımız yazı olan bir önbellek verisi oluşturacaktır.
Oku butonuna bastığımızda CacheYazisi adındaki önbellek değeri okunacak ve ekranda gösterilecektir.
Son olarak sil butonuna bastığımızda da CacheYazisi adındaki önbellek değeri, önbellekten silinecektir.

  • Makalenin kaynak kodlarına ulaşmak için buraya tıklayınız.

    Umarım faydalı olmuştur.

    İsmail AKTAŞ
  • Yazar Hakkında Yorum Yok Yorum Yaz Yazara ait diğer Makaleler
    Tema
    Anket
    ASP.NET MVC'yi Projeleriniz de kullandınız mı?


    En Çok Okunan Makaleler
    En Son Eklenen Makaleler
    Soru Merkezinde Bekleyenler
    Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
    Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.