Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Önbelleğe alma, yavaş ve hızlı bir Web uygulaması arasındaki fark anlamına gelebilir. Bu öğretici, ASP.NET'da önbelleğe alma işlemine ayrıntılı olarak göz atan dört öğreticiden ilkidir. ObjectDataSource denetimi aracılığıyla önbellekle ilgili temel kavramları ve sunu katmanına önbelleğe alma uygulama hakkında bilgi edinin.
Giriş
Bilgisayar biliminde önbelleğe alma , elde etmek için pahalı olan verileri veya bilgileri alma ve kopyalarını daha hızlı erişilen bir konumda depolama işlemidir. Veri temelli uygulamalar için büyük ve karmaşık sorgular genellikle uygulamanın yürütme süresinin çoğunu kullanır. Bu tür bir uygulamanın performansı, genellikle pahalı veritabanı sorgularının sonuçları uygulamanın belleğinde depolanarak geliştirilebilir.
ASP.NET 2.0 çeşitli önbelleğe alma seçenekleri sunar. Tüm web sayfası veya Kullanıcı Denetimi'nin işlenmiş işaretlemesi, çıktı önbelleğe alma yoluyla önbelleğe alınabilir. ObjectDataSource ve SqlDataSource denetimleri de önbelleğe alma özellikleri sağlar ve böylece verilerin denetim düzeyinde önbelleğe alınmasına izin verir. Ayrıca ASP.NET veri önbelleği , sayfa geliştiricilerinin nesneleri program aracılığıyla önbelleğe almalarını sağlayan zengin bir önbelleğe alma API'si sağlar. Bu öğreticide ve sonraki üç öğreticide, ObjectDataSource'un önbelleğe alma özelliklerini ve veri önbelleğini nasıl kullanacağımızı inceleyeceğiz. Ayrıca başlangıçta uygulama genelinde verileri önbelleğe alma ve SQL önbellek bağımlılıkları kullanarak önbelleğe alınan verileri güncel tutma hakkında da bilgi edineceğiz. Bu öğreticiler çıkış önbelleğe alma işlemini incelemez. Çıktı önbelleğine ayrıntılı bir bakış için bkz. ASP.NET 2.0'da Çıktı Önbelleği.
Önbelleğe alma, Veri Erişim Katmanı'ndan Sunu Katmanı'na kadar mimarinin herhangi bir yerinde uygulanabilir. Bu öğreticide, ObjectDataSource denetimi aracılığıyla Sunu Katmanına önbelleğe alma uygulama konusuna bakacağız. Sonraki öğreticide İş Mantığı Katmanı'nda önbelleğe alma verilerini inceleyeceğiz.
Anahtar Önbelleğe Alma Kavramları
Önbelleğe alma, bir kopyasını oluşturmak için pahalı olan verileri alıp daha verimli bir şekilde erişilebilen bir konumda depolayarak uygulamanın genel performansını ve ölçeklenebilirliğini büyük ölçüde iyileştirebilir. Önbellekte gerçek, temel alınan verilerin yalnızca bir kopyası bulunduğundan, temel alınan veriler değişirse eski veya eski olabilir. Bununla mücadele etmek için, bir sayfa geliştirici önbellek öğesinin önbellekten çıkarılacağı ölçütleri şu şekilde belirtebilir:
- Zaman tabanlı ölçütler için bir öğe, mutlak veya kayan süre boyunca önbelleğe eklenebilir. Örneğin, sayfa geliştiricisi 60 saniyelik bir süre gösterebilir. Mutlak süreyle, önbelleğe alınan öğe ne sıklıkta erişildiğine bakılmaksızın önbelleğe eklendikten 60 saniye sonra çıkarılır. Kayan süreyle, önbelleğe alınan öğe son erişimden 60 saniye sonra çıkarılır.
- Bir bağımlılığın önbelleğe eklendiğinde bir öğeyle ilişkilendirilebileceği bağımlılık tabanlı ölçütler. Öğenin bağımlılığı değiştiğinde önbellekten çıkarılır. Bağımlılık bir dosya, başka bir önbellek öğesi veya ikisinin birleşimi olabilir. ASP.NET 2.0, geliştiricilerin önbelleğe bir öğe eklemesini ve temel alınan veritabanı verileri değiştiğinde çıkarılmasını sağlayan SQL önbellek bağımlılıklarına da olanak tanır. Gelecek SQL Önbelleği Bağımlılıklarını Kullanma öğreticisinde SQL önbelleği bağımlılıklarını inceleyeceğiz.
Belirtilen çıkarma ölçütlerinden bağımsız olarak, zaman tabanlı veya bağımlılık tabanlı ölçütler karşılanmadan önce önbellekteki bir öğe temizlenebilir. Önbellek kapasitesine ulaştıysa, yeni öğelerin eklenebilmesi için önce mevcut öğelerin kaldırılması gerekir. Sonuç olarak, önbelleğe alınan verilerle program aracılığıyla çalışırken, önbelleğe alınan verilerin mevcut olmayabileceğini her zaman varsaymanız çok önemlidir. Sonraki öğreticimiz olan Mimaride Verileri Önbelleğe Alma öğreticimizde önbellekten verilere program aracılığıyla erişirken kullanılacak desene göz atacağız.
Önbelleğe alma, bir uygulamadan daha fazla performans sıkıştırmak için ekonomik bir araç sağlar. Steven Smith'inönbelleğe alma ASP.NET makalesinde belirttiği gibi: Teknikler ve En İyi Yöntemler:
Önbelleğe alma, çok fazla zaman ve analiz gerektirmeden yeterince iyi performans elde etmenin iyi bir yolu olabilir. Bellek ucuz olduğundan, kodunuzu veya veritabanınızı iyileştirmeye çalışmak için bir gün veya bir hafta harcamak yerine çıktıyı 30 saniye önbelleğe alarak ihtiyacınız olan performansı elde edebilirseniz, önbelleğe alma çözümünü (30 saniyelik eski verilerin iyi olduğu varsayılarak) yapın ve devam edin. Sonunda, kötü tasarım muhtemelen sizi yakalayacaktır, bu nedenle elbette uygulamalarınızı doğru tasarlamaya çalışmanız gerekir. Ancak, bugün yeterli performans elde etmeniz gerekiyorsa önbelleğe alma mükemmel bir [yaklaşım] olabilir ve bunu yapmak için zamanınız olduğunda uygulamanızı daha sonraki bir tarihte yeniden düzenlemeniz için zaman kazandırabilir.
Önbelleğe alma, uygun performans geliştirmeleri sağlayabilir ancak gerçek zamanlı, sık güncelleştirilen veriler kullanan veya kısa süreli eski verilerin kabul edilemez olduğu uygulamalar gibi her durumda geçerli değildir. Ancak uygulamaların çoğu için önbelleğe alma kullanılmalıdır. ASP.NET 2.0'da önbelleğe alma hakkında daha fazla arka plan için ASP.NET 2.0 Hızlı Başlangıç Öğreticileri'ninPerformans için Önbelleğe Alma bölümüne bakın.
1. Adım: Önbelleğe Alma Web Sayfalarını Oluşturma
ObjectDataSource'un önbelleğe alma özelliklerini keşfetmeye başlamadan önce, web sitesi projemizde bu öğretici ve sonraki üç için ihtiyacımız olacak ASP.NET sayfalarını oluşturmak için biraz zaman ayıralım. adlı Caching
yeni bir klasör ekleyerek başlayın. Ardından, aşağıdaki ASP.NET sayfaları bu klasöre ekleyerek her sayfayı ana sayfayla ilişkilendirdiğinizden Site.master
emin olun:
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
Şekil 1: Caching-Related Öğreticileri için ASP.NET Sayfaları Ekleme
Diğer klasörlerde olduğu gibi Default.aspx
klasöründeki Caching
, bölümündeki öğretici listelenir. Kullanıcı Denetimi'nin SectionLevelTutorialListing.ascx
bu işlevi sağladığını hatırlayın. Bu nedenle, bu Kullanıcı Denetimini Default.aspx
Çözüm Gezgini sayfanın Tasarım görünümüne sürükleyerek öğesine ekleyin.
Şekil 2: Şekil 2: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascx
Default.aspx
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Son olarak, bu sayfaları dosyaya Web.sitemap
girdi olarak ekleyin. Özellikle, İkili Verilerle Çalışma <siteMapNode>
'nın ardından aşağıdaki işaretlemeyi ekleyin:
<siteMapNode title="Caching" url="~/Caching/Default.aspx"
description="Learn how to use the caching features of ASP.NET 2.0.">
<siteMapNode url="~/Caching/ObjectDataSource.aspx"
title="ObjectDataSource Caching"
description="Explore how to cache data directly from the
ObjectDataSource control." />
<siteMapNode url="~/Caching/FromTheArchitecture.aspx"
title="Caching in the Architecture"
description="See how to cache data from within the
architecture." />
<siteMapNode url="~/Caching/AtApplicationStartup.aspx"
title="Caching Data at Application Startup"
description="Learn how to cache expensive or infrequently-changing
queries at the start of the application." />
<siteMapNode url="~/Caching/SqlCacheDependencies.aspx"
title="Using SQL Cache Dependencies"
description="Examine how to have data automatically expire from the
cache when its underlying database data is modified." />
</siteMapNode>
güncelleştirdikten Web.sitemap
sonra, öğreticiler web sitesini bir tarayıcı üzerinden görüntülemek için biraz bekleyin. Sol taraftaki menüde artık önbelleğe alma öğreticileri için öğeler yer alır.
Şekil 3: Site Haritası Artık Önbelleğe Alma Öğreticileri için Girdiler Içeriyor
2. Adım: Web Sayfasında Ürün Listesi Görüntüleme
Bu öğreticide ObjectDataSource denetiminin yerleşik önbelleğe alma özelliklerinin nasıl kullanılacağı incelenir. Ancak bu özelliklere göz atabilmek için öncelikle çalışmamız gereken bir sayfa olması gerekir. Sınıfından ObjectDataSource ProductsBLL
tarafından alınan ürün bilgilerini listelemek için GridView kullanan bir web sayfası oluşturalım.
Öncelikle ObjectDataSource.aspx
klasöründeki Caching
sayfasını açarak başlayın. Araç Kutusu'ndan Tasarımcı'ya bir GridView sürükleyin, ID
özelliğini Products
olarak ayarlayın ve akıllı etiketinden yeni bir ObjectDataSource denetimi olan ProductsDataSource
ile bağlamayı seçin. ObjectDataSource'u ProductsBLL
sınıfıyla çalışacak şekilde yapılandırın.
Şekil 4: ObjectDataSource'ı Sınıfı Kullanacak ProductsBLL
Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu sayfada, ObjectDataSource'ta önbelleğe alınan veriler GridView arabirimi aracılığıyla değiştirildiğinde ne olduğunu inceleyebilmemiz için düzenlenebilir bir GridView oluşturalım. SELECT sekmesindeki açılır listeyi varsayılan durumda bırakın, ancak UPDATE sekmesindeki seçili öğeyi, giriş parametreleri olarak GetProducts()
, UpdateProduct
ve productName
kabul eden unitPrice
aşırı yüklemesiyle değiştirin.
Şekil 5: GÜNCELLEŞTIR Sekmesinin Drop-Down Listesini Uygun UpdateProduct
Aşırı Yükleme olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Son olarak, INSERT ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın ve Son'a tıklayın. Visual Studio, Veri Kaynağını Yapılandırma sihirbazını tamamladıktan sonra ObjectDataSource özelliğini OldValuesParameterFormatString
olarak original_{0}
ayarlar.
Veri Ekleme, Güncelleştirme ve Silmeye Genel Bakış öğreticisinde açıklandığı gibi, güncelleştirme iş akışımızın hatasız devam edebilmesi için bu özelliğin bildirim temelli söz diziminden kaldırılması veya varsayılan değerine {0}
geri ayarlanması gerekir.
Ayrıca, sihirbazın tamamlanmasının ardından Visual Studio, ürün veri alanlarının her biri için GridView'a bir alan ekler. , ve ProductName
CategoryName
BoundFields dışında UnitPrice
tümünü kaldırın. Ardından, bu BoundField'lerin her birinin özelliklerini sırasıyla Product, Category ve Price olarak güncelleştirin HeaderText
. Alan ProductName
gerekli olduğundan, BoundField'i TemplateField'e dönüştürün ve EditItemTemplate
öğesine bir RequiredFieldValidator ekleyin. Benzer şekilde, kullanıcı tarafından girilen değerin UnitPrice
sıfırdan büyük veya sıfıra eşit geçerli bir para birimi değeri olduğundan emin olmak için BoundField'ı TemplateField'a dönüştürün ve CompareValidator ekleyin. Bu değişikliklere ek olarak, UnitPrice
değerini sağa hizalamak veya salt okunur ve düzenleme arayüzlerinde metnin biçimlendirmesini belirtmek için UnitPrice
gibi estetik değişiklikleri de gerçekleştirebilirsiniz.
GridView'un akıllı etiketinde Düzenlemeyi Etkinleştir onay kutusunu işaretleyerek GridView'un düzenlenebilir olmasını sağlayın. Ayrıca Sayfalandırmayı Etkinleştir ve Sıralamayı Etkinleştir onay kutularını işaretleyin.
Uyarı
GridView'un düzenleme arabirimini nasıl özelleştirebileceğinizi gözden geçirmeniz mi gerekiyor? Öyleyse , Veri Değiştirme Arabirimini Özelleştirme öğreticisine geri dönün.
Şekil 6: Düzenleme, Sıralama ve Sayfalama için GridView Desteğini Etkinleştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu GridView değişikliklerini yaptıktan sonra GridView ve ObjectDataSource bildirim temelli işaretlemeleri aşağıdakine benzer görünmelidir:
<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
AllowPaging="True" AllowSorting="True">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:TemplateField HeaderText="Product" SortExpression="ProductName">
<EditItemTemplate>
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator1" Display="Dynamic"
ControlToValidate="ProductName" SetFocusOnError="True"
ErrorMessage="You must provide a name for the product."
runat="server">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server"
Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
<EditItemTemplate>
$<asp:TextBox ID="UnitPrice" runat="server" Columns="8"
Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1"
ControlToValidate="UnitPrice" Display="Dynamic"
ErrorMessage="You must enter a valid currency value with no
currency symbols. Also, the value must be greater than
or equal to zero."
Operator="GreaterThanEqual" SetFocusOnError="True"
Type="Currency" runat="server"
ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>
<ItemStyle HorizontalAlign="Right" />
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("UnitPrice", "{0:c}") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="{0}" SelectMethod="GetProducts"
TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Şekil 7'de gösterildiği gibi, düzenlenebilir GridView veritabanındaki her ürünün adını, kategorisini ve fiyatını listeler. Sayfa işlevselliğini test etmek için biraz zaman ayırın, sonuçları sıralayın, sayfalara göz atın ve bir kaydı düzenleyin.
Şekil 7: Her Ürünün Adı, Kategorisi ve Fiyatı Sıralanabilir, Sayfalanabilir, Düzenlenebilir Bir GridView'da Listelenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
3. Adım: ObjectDataSource Veri Talep Ettiğinde İncelenmesi
Products
GridView, Select
ObjectDataSource nesnesinin ProductsDataSource
yöntemini çağırarak görüntülenecek verilerini alır. Bu ObjectDataSource, İş Mantığı Katmanı ProductsBLL
sınıfının bir örneğini oluşturur ve yöntemini çağırır GetProducts()
ve bu da Veri Erişim Katmanı'nın ProductsTableAdapter
GetProducts()
yöntemini çağırır. DAL yöntemi Northwind veritabanına bağlanır ve yapılandırılan SELECT
sorguyu gönderir. Daha sonra bu veriler DAL'ye döndürülür ve bir NorthwindDataTable
içinde paketler. DataTable nesnesi BLL'ye döndürülür ve bu nesne ObjectDataSource'a döndürülür ve bu nesne GridView'a döndürülür. Ardından GridView, DataTable'daki her GridViewRow
biri için bir DataRow
nesne oluşturur ve her GridViewRow
biri sonunda istemciye döndürülen ve ziyaretçinin tarayıcısında görüntülenen HTML'ye işlenir.
GridView'un altyapısındaki verilerine bağlanması gerektiğinde bu olay dizisi her defasında gerçekleşir. Bu durum, sayfa ilk ziyaret edildiğinde, bir veri sayfasından diğerine geçerken, GridView'u sıralarken veya yerleşik düzenleme veya silme arabirimleri aracılığıyla GridView verilerini değiştirirken gerçekleşir. GridView'un görünüm durumu devre dışı bırakılırsa, GridView her geri göndermede de yeniden eklenir. GridView, DataBind()
yöntemini çağırarak verilerine açıkça yeniden bağlanabilir.
Verilerin veritabanından alınma sıklığını tam olarak takdir etmek için verilerin ne zaman yeniden alındığını belirten bir ileti görüntüleyelim. GridView'un üzerine adlı ODSEvents
bir Label Web denetimi ekleyin. Özelliğini Text
temizleyin ve özelliğini EnableViewState
olarak false
ayarlayın. Etiket'in altına bir Düğme Web denetimi ekleyin ve özelliğini Text
Postback olarak ayarlayın.
Şekil 8: GridView'un Üstündeki Sayfaya Etiket ve Düğme Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Veri erişim iş akışı sırasında ObjectDataSource olayında Selecting
, temel alınan nesne oluşturulmadan ve yapılandırılan yöntemi çağrılmadan önce tetiklenir. Bu olay için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:
protected void ProductsDataSource_Selecting(object sender,
ObjectDataSourceSelectingEventArgs e)
{
ODSEvents.Text = "-- Selecting event fired";
}
ObjectDataSource her veri isteğinde bulunduğunda, Etiket "Seçim olayı tetiklendi" metnini görüntüler.
Bu sayfayı tarayıcıda ziyaret edin. Sayfa ilk kez ziyaret edildiğinde, Seçme olayı tetiklendi metni gösterilir. Geri Gönder düğmesine tıklayın ve metnin kaybolduğunu unutmayın (GridView s EnableViewState
özelliğinin varsayılan olarak ayarlandığını true
varsayarsak). Bunun nedeni, geri gönderim sırasında GridView'un görünüm durumundan yeniden yapılandırılması ve bu nedenle ObjectDataSource'dan veri almaya dönmemesidir. Ancak verileri sıralama, sayfalama veya düzenleme, GridView'un veri kaynağına yeniden bağlamasına neden olur ve bu nedenle Selecting olayı tetiklenen metin yeniden görünür.
Şekil 9: GridView Veri Kaynağına Her Yeniden Bağlandığında, tetikleme olayı görünür (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 10: Geri Gönderme Düğmesine Tıklanması GridView'un Görünüm Durumundan Yeniden Yapılandırılmasına Neden Oluyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Veriler her sayfalandırıldığında veya sıralandığında veritabanı verilerini almak gereksiz gibi görünebilir. Sonuçta, varsayılan disk belleğini kullandığımız için, ObjectDataSource ilk sayfayı görüntülerken tüm kayıtları almıştır. GridView sıralama ve sayfalama desteği sağlamasa bile, sayfanın herhangi bir kullanıcı tarafından ilk ziyaretinde (ve görünüm durumu devre dışıysa her geri göndermede) verilerin veritabanından alınması gerekir. Ancak GridView tüm kullanıcılara aynı verileri gösteriyorsa, bu ek veritabanı istekleri gereksizdir. Neden yönteminden GetProducts()
döndürülen sonuçları önbelleğe alıp GridView'ı önbelleğe alınan sonuçlara bağlamıyoruz?
4. Adım: ObjectDataSource Kullanarak Verileri Önbelleğe Alma
Yalnızca birkaç özellik ayarlayarak ObjectDataSource, alınan verileri ASP.NET veri önbelleğinde otomatik olarak önbelleğe alacak şekilde yapılandırılabilir. Aşağıdaki liste ObjectDataSource'un önbellekle ilgili özelliklerini özetler:
- Önbelleğe almayı etkinleştirmek için
true
olarak ayarlanmalıdır. Varsayılan değer:false
. -
CacheDuration, verilerin önbellekte tutulduğu süreyi, saniye cinsinden belirtir. Varsayılan değer 0'dır. ObjectDataSource yalnızca
EnableCaching
vetrue
şartları sağlandığında veCacheDuration
sıfırdan büyük bir değere ayarlandığında verileri önbelleğe alır. -
CacheExpirationPolicy
Absolute
veyaSliding
olarak ayarlanabilir. tr-TR: EğerAbsolute
ise, ObjectDataSource aldığı verileriCacheDuration
saniye boyunca önbelleğe alır; eğerSliding
ise, veriler sadeceCacheDuration
saniye boyunca erişilmediğinde süresi dolar. Varsayılan değer:Absolute
. -
CacheKeyDependency , ObjectDataSource önbellek girdilerini mevcut bir önbellek bağımlılığıyla ilişkilendirmek için bu özelliği kullanır. ObjectDataSource veri girdileri, ilişkili
CacheKeyDependency
'nin süresi dolarak önbellekten erken çıkarılabilir. Bu özellik en yaygın olarak sql önbelleği bağımlılığını ObjectDataSource önbelleğiyle ilişkilendirmek için kullanılır. Bu konu, gelecekte SQL Önbelleği Bağımlılıklarını Kullanma öğreticisinde inceleyeceğiz.
ObjectDataSource'un verilerini mutlak ölçekte 30 saniye boyunca önbelleğe almak için yapılandıralım ProductsDataSource
. ObjectDataSource s EnableCaching
özelliğini olarak true
ve CacheDuration
özelliğini 30 olarak ayarlayın.
CacheExpirationPolicy
özelliğini varsayılan Absolute
değeri olan olarak bırakın.
Şekil 11: ObjectDataSource'un Verilerini 30 Saniye Boyunca Önbelleğe Almak için Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Değişikliklerinizi kaydedin ve bu sayfayı tarayıcıda yeniden ziyaret edin. Sayfayı ilk ziyaret ettiğinizde, veriler başlangıçta önbellekte olmadığından "Seçim olayı tetiklendi" metni görüntülenecektir. Ancak Geri Gönder düğmesine tıklandığında, sıralama, sayfalama veya Düzenle veya İptal düğmelerine tıklanarak tetiklenen sonraki geri göndermeler, Selecting olayı tetiklenen metnini yeniden göstermez . Bunun nedeni, Selecting
olayının yalnızca ObjectDataSource verilerini temel alınan nesneden aldığında tetiklenmesi; veriler veri önbelleğinden çekildiğinde Selecting
olayının tetiklenmemesidir.
30 saniye sonra veriler önbellekten çıkarılır. ObjectDataSource' un Insert
, Update
veya Delete
yöntemleri çağrılırsa veriler de önbellekten çıkarılır. Sonuç olarak, 30 saniye geçtikten veya Güncelleştir düğmesine tıklandıktan sonra, sıralama, sayfalama veya Düzenle ya da İptal düğmelerine tıklamak, ObjectDataSource'un verilerini temel aldığı nesneden almasına neden olur ve Selecting
olayı tetiklendiğinde "Olay tetiklendi" metnini görüntüler. Döndürülen bu sonuçlar veri önbelleğine geri yerleştirilir.
Uyarı
Önbelleğe alınmış verilerle çalışmasını beklediğinizde bile, Selecting olayı tetiklenen metni sık sık görüyorsanız, bunun nedeni bellek kısıtlamaları olabilir. Yeterli boş bellek yoksa, ObjectDataSource tarafından önbelleğe eklenen veriler atılmış olabilir. ObjectDataSource verileri doğru önbelleğe alınmış gibi görünmüyorsa veya yalnızca verileri rastgele önbelleğe alırsa, belleği boşaltmak için bazı uygulamaları kapatın ve yeniden deneyin.
Şekil 12'de ObjectDataSource'un önbelleğe alma iş akışı gösterilmektedir. Seçme olayı tetiklendiğinde ekranda metin beliriyorsa, bunun nedeni verilerin önbellekte olmaması ve temeldeki nesneden alınması gerektiği içindir. Ancak bu metin eksik olduğunda, bunun nedeni verilerin önbellekten kullanılabilir olmasıdır. Veriler önbellekten döndürülürken, temel alınan nesneye çağrı yapılmaz ve bu nedenle veritabanı sorgusu yürütülmüyor.
Şekil 12: ObjectDataSource Verilerini Veri Önbelleğinden Depolar ve Alır
Her ASP.NET uygulamasının tüm sayfalarda ve ziyaretçilerde paylaşılan kendi veri önbelleği örneği vardır. Bu, ObjectDataSource tarafından veri önbelleğinde depolanan verilerin aynı şekilde sayfayı ziyaret eden tüm kullanıcılar arasında paylaşıldığını gösterir. Bunu doğrulamak için sayfayı ObjectDataSource.aspx
tarayıcıda açın. Sayfayı ilk kez ziyaret ettiğinizde, 'Seçim etkinliği tetiklendi' metni görüntülenir (önceki testlere göre önbelleğe eklenen verilerin bu zamana kadar çıkarıldığı varsayılarak). İkinci bir tarayıcı örneği açın ve url'yi kopyalayıp ilk tarayıcı örneğinden ikincisine yapıştırın. İkinci tarayıcı örneğinde, birinciyle aynı önbelleğe alınmış verileri kullandığı için Seçme olayının tetiklendiği metin görünmüyor.
Alınan verileri önbelleğe eklerken, ObjectDataSource, şunu içeren bir önbellek anahtarı değeri kullanır: CacheDuration
ve CacheExpirationPolicy
özellik değerleri; ObjectDataSource tarafından kullanılan temel iş nesnesinin türü, TypeName
özelliği (ProductsBLL
, bu örnekte); SelectMethod
özelliği ile koleksiyondaki SelectParameters
parametrelerinin adı ve değerleri; ve StartRowIndex
ve MaximumRows
özelliklerinin değerleri, özel sayfalama uygulanırken kullanılır.
Önbellek anahtarı değerini bu özelliklerin bir bileşimi olarak oluşturmak, bu değerler değiştikçe benzersiz bir önbellek girdisi olmasını sağlar. Örneğin, önceki öğreticilerde, belirtilen kategoriye ait tüm ürünleri döndüren s ProductsBLL
sınıfını GetProductsByCategoryID(categoryID)
kullanmayı inceledik. Bir kullanıcı sayfaya gelip içecekleri görüntüleyebilir, bu seçeneklerin CategoryID
değeri 1’dir. ObjectDataSource, SelectParameters
değerlerini dikkate almadan sonuçlarını önbelleğe aldıysa, içecek ürünleri önbellekteyken başka bir kullanıcı baharatları görüntülemek için sayfaya geldiğinde, baharatlar yerine önbellekteki içecek ürünlerini görür. ObjectDataSource, önbellek anahtarını SelectParameters
, değerlerini içeren özelliklere göre değiştirerek içecekler ve çeşniler için ayrı bir önbellek girişi tutar.
Bayat Veri Endişeleri
ObjectDataSource, Insert
, Update
veya Delete
yöntemlerinden herhangi biri çağrıldığında öğelerini önbellekten otomatik olarak kaldırır. Bu, veriler sayfa üzerinden değiştirildiğinde önbellek girdilerini temizleyerek eski verilere karşı korumaya yardımcı olur. Ancak önbelleğe alma kullanan bir ObjectDataSource'un eski verileri görüntülemeye devam etmek mümkündür. En basit durumda, bunun nedeni verilerin doğrudan veritabanı içinde değişmesi olabilir. Belki de veritabanı yöneticisi veritabanındaki bazı kayıtları değiştiren bir betik çalıştırmış olabilir.
Bu senaryo daha ince bir şekilde de ortaya çıkabilir. ObjectDataSource, veri değiştirme yöntemlerinden biri çağrıldığında öğelerini önbellekten çıkarsa da, önbelleğe alınan öğeler ObjectDataSource'un özellik değerlerinin (CacheDuration
, TypeName
, SelectMethod
, vb.) belirli bir bileşimine yöneliktir. farklı SelectMethods
veya SelectParameters
kullanan ancak yine de aynı verileri güncelleştirebilen iki ObjectDataSource'nuz varsa, bir ObjectDataSource bir satırı güncelleştirebilir ve kendi önbellek girdilerini geçersiz kılabilir, ancak ikinci ObjectDataSource için karşılık gelen satır önbelleğe alınmış durumda kalır. Bu işlevselliği sergilemek için sayfalar oluşturmanızı tavsiye ederim. Önbelleğe alma kullanan ve ProductsBLL
yönteminden veri alacak şekilde yapılandırılmış olan bir ObjectDataSource'tan GetProducts()
verilerini çeken düzenlenebilir bir GridView'i görüntüleyen bir sayfa oluşturun. Bu sayfaya (veya başka bir sayfaya) başka bir düzenlenebilir GridView ve ObjectDataSource ekleyin, ancak bu ikinci ObjectDataSource için GetProductsByCategoryID(categoryID)
yöntemi kullanılsın. İki ObjectDataSources SelectMethod
özelliği farklı olduğundan, her birinin kendi önbelleğe alınmış değerleri olur. Bir ürünü bir kılavuzda düzenlerseniz, verileri diğer kılavuza yeniden bağladığınızda (sayfalandırma, sıralama vb. yoluyla) eski, önbelleğe alınmış verileri göstermeye devam eder ve diğer kılavuzda yapılan değişikliği yansıtmaz.
Kısacası, eski veri potansiyeline sahip olmak istiyorsanız yalnızca zamana bağlı süre sonunu kullanın ve verilerin yeniliğinin önemli olduğu senaryolar için daha kısa süre sonu kullanın. Eski veriler kabul edilemezse, ya önbelleğe almayı bırakın ya da SQL önbellek bağımlılıklarını kullanın (verilerin veritabanı verileri olduğu varsayılarak). Sql önbelleği bağımlılıklarını gelecekteki bir öğreticide keşfedeceğiz.
Özet
Bu öğreticide ObjectDataSource'un yerleşik önbelleğe alma özelliklerini inceledik. Yalnızca birkaç özellik ayarlayarak ObjectDataSource'a belirtilenden SelectMethod
döndürülen sonuçları ASP.NET veri önbelleğinde önbelleğe almalarını bildirebiliriz.
CacheDuration
ve CacheExpirationPolicy
özellikleri, öğenin önbelleğe alınma süresini ve mutlak veya kayan süre sonu olup olmadığını belirtir. özelliği, CacheKeyDependency
ObjectDataSource'un tüm önbellek girdilerini mevcut bir önbellek bağımlılığıyla ilişkilendirir. Bu, zamana bağlı süre sonu ulaşılmadan önce ObjectDataSource girdilerini önbellekten çıkarmak için kullanılabilir ve genellikle SQL önbellek bağımlılıklarıyla birlikte kullanılır.
ObjectDataSource yalnızca değerlerini veri önbelleğine önbelleğe aldığı için ObjectDataSource'un yerleşik işlevselliğini program aracılığıyla çoğaltabiliriz. ObjectDataSource bu işlevi kullanıma hazır olarak sunduğundan, bunu Sunu Katmanı'nda yapmak mantıklı değildir, ancak önbelleğe alma özelliklerini mimarinin ayrı bir katmanında uygulayabiliriz. Bunu yapmak için ObjectDataSource tarafından kullanılan mantığın aynısını tekrarlamamız gerekir. Sonraki öğreticimizde, mimarinin içerisinden veri önbelleği ile programatik olarak nasıl çalışılacağını inceleyeceğiz.
Mutlu Programlama!
Daha Fazla Okuma
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- ASP.NET Önbelleğe Alma: Teknikler ve En İyi Yöntemler
- .NET Framework Uygulamaları için Önbelleğe Alma Mimarisi Kılavuzu
Yazar Hakkında
Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçireni Teresa Murphy'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.