|
|
|
Caching Mekanizmasını Anlamak - 1 |
|
| Gönderiliyor lütfen bekleyin... |
|
|
Bu makalemiz ile birlikte, web
sayfalarının istemcilere daha hızlı bir şekilde ulaştırılmasında
kullanılan tekniklerden birisi olan Caching (Ara Belleğe Alma)
mekanizmasını incelemeye başlıyacağız. Akıllıca kullanıldığı takdirde
web uygulamalarında istemcilere nazaran göreceli olarak performans
artışına neden olan Caching (Ara Belleğe Alma) mekanizması, teorik
olarak bir web sayfasının tamamının ya da bir parçasının ara belleğe
alınarak belli bir süre boyunca burada tutulması prensibini temel alarak
çalışır. Asp.Net uygulamaları söz konusu olduğunda bir sayfanın
tamamını, belli bir veri kümesini veya sayfa üzerindeki herhangibir
kontrolü ara belleğe alabiliriz. Buna göre Asp.Net uygulamalarındaki
Caching (Ara Belleğe Alma) mekanizması aşağıdaki üç farklı tekniği
destekler.
| Asp.Net
Uygulamaları İçin Caching (Ara Belleğe Alma) Teknikleri |
|
1 - Output Caching ( Çıktının Ara Belleğe Alınması ) |
|
2 - Data Caching ( Verilerin Ara Belleğe Alınması ) |
|
3 - Fragment Caching ( Parçaların Ara Belleğe Alınması ) |
Output Caching tekniğinde, bir aspx
sayfasının tüm içeriği ara belleğe alınır ve belirli bir süre boyunca
burada tutulur. Bu mekanizmanın çalışma biçimini aşağıdaki şekil ile
daha kolay irdeleyebiliriz. Bu çalışma sistemi temel olarak diğer
Caching mekanizmalarında da aynı şekilde işlemektedir. Değişen sadece
ara belleğe alınan HTML görüntüsünün içeriği olacaktır.

İlk olarak, birinci istemci web
sunucusundan bir aspx sayfasını talep eder. Web sunucusu sayfanın
ilişkili kodlarını çalıştırarak bir çıktı üretir ve bu sayfa için Output
Caching (Çıktının Ara Belleğe Alınması) aktif ise üretilen HTML
sonuçlarını istemciye gönderir. Hemen ardından gönderilen HTML içeriğini belirtilen süre boyunca(duration) tutmak
üzere sunucu üzerindeki ara belleğe alır.
Şimdi ikinci bir istemcinin devamlılık
süresi (Duration) içerisindeyken aynı sayfayı sunucudan talep ettiğini
düşünelim. Bu durumda web sunucusu, talep edilen
sayfanın Cache (Ara Bellek) üzerinde olup olmadığına bakar. Eğer ikinci
kullanıcı talebini, Devamlılık Süresi (Duration) içerisindeki bir zaman
diliminde iletmiş ise, web sunucusu istemciye sayfanın ara bellekteki
hazır halini gönderir. Dolayısıyla sayfanın üretilmesinde çalıştırılan
arka plan kodlarının hiç biri tekrardan yürütülmez. Bu elbetteki ikinci
kullanıcının talep ettiği sayfa için daha kısa sürede cevap almasını
sağlar.
Output Caching mekanizmasını bir aspx
sayfasına uygulayabilmek için tek yapılması gereken OutputCache
direktifinin sayfanın aspx kodlarının olduğu kısıma eklemek yeterlidir.
| <%@ OutputCache Duration="300"
VaryByParam="None"%> |
Burada, Duration özelliği ile sayfanın
ilk talep edilişinden sonra 300 saniye (5 dakika) süre ile ara bellekte
tutulacağını bildirmiş oluyoruz. VaryByName parametresini daha sonra
inceleyeceğiz.
Şimdi dilerseniz, kısa bir örnek ile Output Caching
mekanizmasının etkilerini incelemeye çalışalım. Basit bir web uygulaması
geliştireceğiz. Bu uygulamada, Sql Sunucusunda yer alan Pubs isimli veri
tabanındaki Authors isimli tabloya ait verileri bir DataGrid kontrolü
içerisine aktaracağız.
default.aspx sayfamızın kodları;
private void Baglan()
{
con=new SqlConnection("data source=localhost;initial
catalog=pubs;integrated security=SSPI");
cmd=new SqlCommand("SELECT * FROM authors",con);
con.Open();
}
private void Doldur()
{
dr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
dgVeriler.DataSource=dr;
dgVeriler.DataBind();
dr.Close();
}
private void Page_Load(object sender, System.EventArgs e)
{
Baglan();
Doldur();
} |
Uygulama çalıştığında ve default.aspx
sayfasının çıktısı üretildiğinde bu sayfanın son halinin bir kopyasıda ara belleğe
alınır. Yeni koypa ara bellekte 300 saniye (5 dakika ) boyunca
kalacaktır. Aynı sayfayı başka bir tarayıcı’ da açtığımızda ya da aynı
tarayıcı penceresinde iken ileri geri gittiğimizde sayfanın ara bellekte
bulunan halini elde ederiz. Ancak bu örnekte dikkat edilmesi gereken bir
nokta vardır. Bu durumu simule etmek için sayfayı refresh edelim. Bu
durumda sayfanın içeriği aşağıdakine benzer olacaktır.

Daha sonra Duration süresi dolmadan
önce ilk satırın değerini Sql Sunucusu üzerinden değiştirelim. Bu durumda
sayfada Output Caching uygulanmamış olsaydı, sayfayı bir sonraki talep
edişimizde Load metodu çalışacak ve tablonun en güncel hali kullanıcıya
sunulacaktı. Oysaki şimdi sayfayı talep ettiğimizde, yapılan
değişikliğin görünmediğini farkederiz.
Değişiklik;

Yeni bir tarayıcı ile aynı sayfayı
talep ettiğimizde;

Bu işleyiş bazen büyük bir risk
olabilir. Örneğin, sayfanın daha dinamik olduğu durumlarda ve hatta olay
metodlarına cevap vermesi gerektiği durumlarda sayfanın tamamının ara
belleğe alınması, aslında istemcilere sayfanın en güncel halinin
gönderilmesi demek değildir. Bu gibi durumlarda çoğunlukla ya veri
kümelerinin ya da sayfa üzerindeki belirli kısımların (kontrollerin) ara
belleğe alınması tekniği tercih edilir. Bu teknikleri bir sonraki
makalemizde inceleyeceğiz.
Bir sayfanın tamamını ara belleğe
aldığımızda, sayfanın arabellekte yer alacak birden fazla kopyasına ihtiyaç
duyduğumuz durumlar söz konusu olabilir. Çoğunlukla QueryString
kullanımı sırasında başka sayfalara çeşitli parametreleri ve değerlerini
göndeririz. İşte VaryByParam özelliği sayesinde sayfanın, gönderdiğimiz her parametre için ayrı ayrı veya
sadece belirli parametreler için ayrı ayrı kopyalarını ara bellekte
tutabiliriz.
Bu durumu daha yakından inceleyebilmek için
pubs veritabanındaki titles tablosunu kullancağımız bir önrek
geliştirelim. Uygulamanın default.aspx sayfasında bu kez titles
tablosunda yer alan her bir satır için title alanının değerlerini
göstereceğiz. Kullanıcı her hangibir başlığa
tıkladığında bu kitap ile ilgili detaylı bilgilerin olduğu başka bir
sayfaya(detay.aspx) gidecek. Detay sayfası kitabın Primary Key
değerini (title_id) QueryString parametresi olarak alacak. Bu durumda, detay sayfası
için ara belleğe alma işlemini gerçekleştirebiliriz. Konuyu daha iyi
anlayabilmek için örnek üzerinden adım adım gidelim. İlk olarak ana
sayfamızın (default.aspx) aspx içeriğini aşağıdaki gibi değiştirmeliyiz.
<asp:DataGrid id="dgVeriler"
style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 88px"
runat="server" AutoGenerateColumns="False" Height="160px"
Width="264px" BorderColor="#DEBA84" BorderStyle="None"
BorderWidth="1px" CellSpacing="2"
BackColor="#DEBA84" CellPadding="3">
<FooterStyle ForeColor="#8C4510"
BackColor="#F7DFB5"></FooterStyle>
<SelectedItemStyle Font-Bold="True" ForeColor="White"
BackColor="#738A9C"></SelectedItemStyle>
<ItemStyle ForeColor="#8C4510" BackColor="#FFF7E7"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White"
BackColor="#A55129"></HeaderStyle>
<PagerStyle HorizontalAlign="Center" ForeColor="#8C4510"
Mode="NumericPages"></PagerStyle>
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="title_id"
DataNavigateUrlFormatString="Detay.aspx?title_id={0}"
DataTextField="title" HeaderText="Başlık"></asp:HyperLinkColumn>
</Columns>
</asp:DataGrid> |
Bu değişiklik sayesinde, dataGrid
kontrolümüzden Detay.aspx sayfasına title_id alanının değerini parametre
olarak gönderebileceğiz. Şimdi Detay.aspx sayfamının kodlarını aşağıdaki
gibi geliştirelim.
private void Baglan(string Id)
{
con=new SqlConnection("data source=localhost;initial
catalog=pubs;integrated security=SSPI");
cmd=new SqlCommand("SELECT title_id,title,price,pubdate
FROM titles WHERE title_id=’"+Id+"’",con);
con.Open();
}
private void Doldur()
{
dr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
dgDetaylar.DataSource=dr;
dgDetaylar.DataBind();
dr.Close();
}
private void Page_Load(object sender, System.EventArgs e)
{
string id=Request.Params["title_id"].ToString();
Baglan(id);
Doldur();
} |
Burada ara belleğe alma işlemini Detay.aspx
sayfası üzerinde uyguluyoruz. Çünkü detay.aspx, dinamik olarak içeriği
gelen parametre değerine göre değişen bir sayfadır. Biz gelen parametre
değerine göre üretilen sayfaların html çıktılarını ara belleğe almak
istiyoruz. İşte bunun için yine aspx kodlarının başına OutputCache
direktifini aşağıdaki gibi eklememiz gerekiyor.
| <%@ OutputCache Duration="300"
VaryByParam="title_id"%> |
Böylece detay.aspx sayfası her
çalıştırıldığında gelen title_id değeri baz alınarak ara bellekte 300
saniye süreyle duracak olan html çıktılarının oluşturulmasına imkan
sağlıyoruz. Olayı şu şekilde irdelersek daha anlaşılır olacaktır;
|
Parametre tabanlı
OutputCache işlemi |
|
İstemci title_id değeri BU1032 olan satırı detay.aspx
sayfasından ister. Bu durumda detay.aspx sayfasının içeriği ara
belleğe alınır. Bu sayfayı A olarak düşünelim. |
detay.aspx in A koypası oluşturulur. |
|
Başka bir İstemci title_id değeri MC2222 olan sayfayı talep
eder. Bu durumda detay.aspx sayfasının yeni halinin kopyası ara
belleğe alınır. |
detay.aspx in B koypası oluşturulur. |
|
Başka bir İstemci title_id değeri MC2222 olan sayfayı talep
eder. Eğer duration süresi dolmadıysa talep edilen bu sayfanın
çıktısı ara bellekte zaten olduğundan istemciye direkt olarak bu
çıktı gönderilir. |
detay.aspx in var olan B kopyası döner. |
|
Başka bir İstemci title_id değeri BU1032 olan sayfayı talep
eder. Eğer duration süresi dolmadıysa talep edilen bu sayfanın
çıktısı ara bellekte zaten olduğundan istemciye direkt olarak bu
çıktı gönderilir. |
detay.aspx in var olan A kopyası döner. |
|
*
Duration süreleri dolduğunda ise gelen talebe göre ara
bellekteki sayfa çıktıları tekrardan oluşturulur. |
Görüldüğü gibi VaryByParam özelliği ile,
bir sayfanın kendisine QeuryString ile gelen parametrelerinin değerine
göre farklı ara bellek görüntülerini elde edebilmekteyiz. Bazı
durumlarda talep edilen sayfaya birden fazla parametre gönderildiği veya
hiç parametre gönderilmeden çağrıldığıda olur. Bu durumu karşılamak için
VaryByParam özelliğine * değerini atayabiliriz.
| <%@ OutputCache Duration="300"
VaryByParam="*" %> |
Her ne kadar bir sayfanın Output Cache
tekniği ile ara belleğe alınması avantajlı görünsede, özellikle olay
kodlamalı sayfaların işleyişinde bu kullanım sorunlara yol açabilir. Her
şeyden önce sayfa içinde postback’ e neden olan kodlamalar var ise,
sayfa ilk çağrıldıktan sonra ara belleğe alınacağından bu kod satırları
duration süresi sonlanana kadar yürütülmeyecektir. Diğer yandan zaman
zaman, sayfalarımızın içeriği dinamik olarak değişmek zorunda kalabilir.
Bu gibi durumlarda da sayfanın tamamının ara belleğe alınması iyi bir
yöntem değildir. Çözüm, sayfanın belirli parçalarının veya sayfadaki
herhangibir veri kümesinin(kümelerinin) ara belleğe alınmasıdır. Data
Caching ve Fragment Caching tekniklerini bir sonraki makalemizde
inceleyeceğiz. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.
Örnek
uygulama için tıklayın.
Burak Selim ŞENYURT
selim@bsenyurt.com
Makale:
Caching Mekanizmasını Anlamak - 1 ASP.NET Burak Selim Şenyurt
|
|
OCA 22
2005 |
Sn.Şenyurt makale için teşekkür ediyoruz. İyi çalışmalar. |
|
|
Sayfalar :
|
|
|
|
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|
|