ObjectDataSource ile Verileri Önbelleğe Alma (C#)

Scott Mitchell tarafından

Örnek uygulamayı indirin veya PDF 'yi indirin

Önbelleğe alma, yavaş ve hızlı bir Web uygulaması arasındaki farkı ifade edebilir. Bu öğretici, ASP.NET ' de önbelleğe alma hakkında ayrıntılı bir bakış sunan ilk dört ilkidir. Önbelleğe alma işleminin temel kavramlarını ve ObjectDataSource denetimi aracılığıyla Sunu katmanına nasıl önbelleğe alınacağını öğrenin.

Giriş

Bilgisayar bilimi ' nde, önbelleğe alma , bir kopyasını elde etmek ve bir kopyasını daha hızlı bir konuma depolamak için pahalı olan verileri veya bilgileri alma işlemidir. Veri odaklı uygulamalar için büyük ve karmaşık sorgular genellikle uygulama yürütme zamanının çoğunu kullanır. Bu tür bir uygulama performansı daha sonra, uygulama s belleğindeki pahalı Veritabanı sorgularının sonuçları depolanarak genellikle iyileşebilirler.

ASP.NET 2,0, çeşitli önbelleğe alma seçenekleri sunar. Tüm Web sayfası veya Kullanıcı denetimi işlenmiş işaretleme, çıktı önbelleğiaracılığıyla önbelleğe alınabilir. ObjectDataSource ve SqlDataSource denetimleri, önbelleğe alma yeteneklerini de sağlar ve bu sayede verilerin Denetim düzeyinde önbelleğe alınmasına izin verir. Ve ASP.NET s veri önbelleği , sayfa geliştiricilerinin nesneleri programlı bir şekilde önbelleğe almasını sağlayan zengin bir önbelleğe alma API 'si sağlar. Bu öğreticide ve sonraki üç adımda, ObjectDataSource s önbelleğe alma özelliklerinin yanı sıra veri önbelleğinin kullanılması anlatılmaktadır. Ayrıca, başlangıçta uygulama genelinde verilerin nasıl önbelleğe alınacağını ve SQL önbellek bağımlılıklarının kullanımı aracılığıyla önbelleğe alınmış verilerin nasıl güncel tutulacağını araştıracağız. Bu öğreticiler çıktı önbelleğe almayı araştırmaz. Çıktı önbelleğe alma hakkında ayrıntılı bir bakış için bkz. ASP.NET 2,0 'de çıktı önbelleği.

Önbelleğe alma, veri erişim katmanından sunum katmanı üzerinden yukarı, mimaride herhangi bir yerde uygulanabilir. Bu öğreticide, ObjectDataSource denetimi aracılığıyla sunum katmanına önbelleğe alma uygulama bölümüne bakacağız. Sonraki öğreticide Iş mantığı katmanında önbelleğe alma verilerini inceleyeceğiz.

Anahtar önbelleğe alma kavramları

Önbelleğe alma, bir kopyasının oluşturulması ve bir kopyasını daha verimli bir yerde daha etkin erişilebilen bir konuma depolayarak bir uygulamanın genel performansını ve ölçeklenebilirliğini önemli ölçüde iyileştirebilir. Önbellek gerçek, temel alınan verilerin yalnızca bir kopyasını içerdiğinden, temel alınan veriler değişirse eski veya eskiolabilir. Bu, bir sayfa geliştiricisi, önbellek öğesinin önbellekten çıkarılabileceği ölçütü belirtebileceği, aşağıdakilerden birini kullanarak:

  • Zamana dayalı ölçütler mutlak veya kayan bir süre için önbelleğe bir öğe eklenebilir. Örneğin, bir sayfa geliştiricisi bir süreyi, deyin, 60 saniye olarak gösterebilir. Mutlak bir süre ile, önbelleğe alınan öğe, ne sıklıkta erişildiğine bakmaksızın önbelleğe eklendikten sonra 60 saniye çıkarıldı. Kayan bir süre ile, önbelleğe alınmış öğe son erişimden sonra 60 saniye çıkarıldı.
  • Bağımlılık tabanlı ölçütler , bir bağımlılık, önbelleğe eklendiğinde bir öğe ile ilişkilendirilebilir. Öğe bağımlılığının değişiklik yaptığı değişiklikler önbellekten çıkarıldı. Bağımlılık bir dosya, başka bir önbellek öğesi veya ikisinin bir birleşimi olabilir. ASP.NET 2,0 Ayrıca, 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 izin verir. SQL önbellek bağımlılıklarını yakında SQL önbellek bağımlılıkları öğreticisini kullanarak inceleyeceğiz.

Belirtilen çıkarma ölçütlerine bakılmaksızın, zaman tabanlı veya bağımlılık tabanlı ölçütler karşılanmadan önbellekteki bir öğe atılabilir . Önbellek kapasiteye ulaştıysa, yeni bir öğe eklenebilmesi için mevcut öğelerin kaldırılması gerekir. Sonuç olarak, önbelleğe alınmış verilerle programlı olarak çalışırken, her zaman önbelleğe alınan verilerin mevcut olabileceğini varsaymanız gerekir. Sonraki öğreticimizde, mimarideki verileri, mimaride önbelleğe almasırasında kullanarak önbellekteki verilere erişirken kullanılacak düzene bakacağız.

Önbelleğe alma, bir uygulamadan daha fazla performans sağlayan ekonomik bir yol sağlar. Steven Smith , makalede ASP.NET önbelleğe alma: teknikler ve en iyi uygulamalar:

Önbelleğe alma, çok fazla zaman ve analiz gerekmeden yeterince iyi performans sağlamak için iyi bir yoldur. Bellek, bu nedenle, kodunuzu veya veritabanınızı en iyi duruma getirmeye çalışan bir gün veya hafta harcamak yerine çıktıyı 30 saniye boyunca önbelleğe alarak ihtiyacınız olan performansı alabilir, önbelleğe alma çözümünü (30 saniyelik eski verilerin Tamam olduğu varsayıldığında) ve üzerinde geçiş yapabilirsiniz. Sonuç olarak, kötü tasarım büyük olasılıkla sizi sizin için doğru şekilde tasarlayacaktır, böylece uygulamalarınızı doğru bir şekilde tasarlamaya çalışırsınız. Ancak bugün yeterince iyi performans almanız gerekiyorsa, önbelleğe alma işlemi harika bir [yaklaşım] olabilir, bu da uygulamanızı daha sonraki bir tarihte yeniden düzenlemeniz için zaman satın alabilirsiniz.

Önbelleğe alma işlemi, gelişmiş performans iyileştirmeleri sağlayabilse de, gerçek zamanlı, sık güncelleştirilen verileri kullanan uygulamalarla veya hatta daha fazla eski verilerin kabul edilemez olduğu durumlarda olduğu gibi tüm durumlarda geçerli değildir. Ancak uygulamaların çoğunluğu için önbelleğe alma kullanılmalıdır. ASP.NET 2,0 ' de önbelleğe alma hakkında daha fazla arka plan için ASP.NET 2,0 hızlı başlangıç öğreticilerinin performans 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 özelliklerinin araştırmasına başlamadan önce, Web sitesi projemizdeki Bu öğretici ve sonraki üç için gereken ASP.NET sayfalarını oluşturmak için ilk olarak bir süre sürer. Cachingadlı yeni bir klasör ekleyerek başlayın. Ardından, aşağıdaki ASP.NET sayfalarını bu klasöre ekleyerek her bir sayfayı Site.master ana sayfasıyla ilişkilendirdiğinizden emin olun:

  • Default.aspx
  • ObjectDataSource.aspx
  • FromTheArchitecture.aspx
  • AtApplicationStartup.aspx
  • SqlCacheDependencies.aspx

Önbelleğe alma ile Ilgili öğreticiler için ASP.NET sayfaları ekleyin

Şekil 1: önbelleğe alma Ile ilgili öğreticiler Için ASP.NET sayfaları ekleme

Diğer klasörlerde olduğu gibi, Caching klasöründeki Default.aspx öğreticileri bölümündeki öğreticilerin listelecektir. SectionLevelTutorialListing.ascx Kullanıcı denetiminin bu işlevselliği sağladığını hatırlayın. Bu nedenle, bu kullanıcı denetimini Çözüm Gezgini sayfa s Tasarım görünümü üzerine sürükleyerek Default.aspx ekleyin.

Şekil 2: SectionLevelTutorialListing. ascx Kullanıcı denetimini default. aspx 'e ekleme

Şekil 2: Şekil 2: SectionLevelTutorialListing.ascx kullanıcı denetimini Default.aspx 'e ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, bu sayfaları Web.sitemap dosyasına girdi olarak ekleyin. Özellikle, Ikili verilerle çalışmayı tamamladıktan sonra aşağıdaki biçimlendirmeyi ekleyin <siteMapNode>:

<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>

Web.sitemapgüncelleştirildikten sonra Öğreticiler Web sitesini bir tarayıcıdan görüntülemek için bir dakikanızı ayırın. Sol taraftaki menü artık önbelleğe alma öğreticilerinin öğelerini içerir.

Site Haritası artık önbelleğe alma öğreticilerinin girdilerini Içerir

Şekil 3: site haritası artık önbelleğe alma öğreticilerinin girdilerini içerir

2. Adım: bir Web sayfasında ürünlerin listesini görüntüleme

Bu öğreticide, ObjectDataSource denetimi yerleşik önbelleğe alma özelliklerinin nasıl kullanılacağı açıklanır. Bu özelliklere bakmadan önce, ilk olarak bir sayfanın çalışması gerekir. ProductsBLL sınıfından bir ObjectDataSource tarafından alınan ürün bilgilerini listelemek için GridView kullanan bir Web sayfası oluşturalım.

Caching klasöründeki ObjectDataSource.aspx sayfasını açarak başlayın. Araç kutusundan bir GridView 'u tasarımcı üzerine sürükleyin, ID özelliğini Productsolarak ayarlayın ve akıllı etiketinden, ProductsDataSourceadlı yeni bir ObjectDataSource denetimine bağlamayı seçin. ObjectDataSource 'ı ProductsBLL sınıfıyla çalışacak şekilde yapılandırın.

, ObjectDataSource 'ı ProductsBLL sınıfını kullanacak şekilde yapılandırma

Şekil 4: ObjectDataSource 'ı ProductsBLL sınıfını kullanacak şekilde yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu sayfa için, ObjectDataSource 'da önbelleğe alınan veriler GridView s arabirimi aracılığıyla değiştirildiğinde ne olduğunu inceleyebileceğiniz şekilde, s için düzenlenebilir bir GridView oluşturalım. Seç sekmesinde açılan listeyi varsayılan olarak ayarlayın, GetProducts(), ancak GÜNCELLEŞTIR sekmesindeki seçili öğeyi, giriş parametreleri olarak productName, unitPriceve productID kabul eden UpdateProduct aşırı yüklemeye değiştirin.

GÜNCELLEŞTIRME sekmesi açılan listesini uygun UpdateProduct aşırı yüküne ayarla

Şekil 5: güncelleştirme sekmesi s açılan listesini uygun UpdateProduct aşırı yüklemeye 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. Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra Visual Studio, ObjectDataSource OldValuesParameterFormatString özelliğini original_{0}olarak ayarlar. Veri öğreticisini ekleme, güncelleştirme ve silmeye genel bakış konusunda açıklandığı gibi, güncelleştirme iş akışınız hata olmadan devam edebilmesi için, bu özelliğin bildirime dayalı sözdiziminden kaldırılması veya varsayılan değerine ({0}) yeniden ayarlanması gerekir.

Ayrıca, sihirbazın tamamlanması, her ürün veri alanı için GridView 'a bir alan ekler. ProductName, CategoryNameve UnitPrice BoundFields hariç tümünü kaldırın. Ardından, bu BoundFields 'in her birinin HeaderText özelliklerini sırasıyla ürün, kategori ve fiyat olarak güncelleştirin. ProductName alanı gerekli olduğundan, BoundField öğesini TemplateField öğesine dönüştürün ve EditItemTemplatebir RequiredFieldValidator ekleyin. Benzer şekilde, UnitPrice BoundField öğesini TemplateField 'a dönüştürün ve Kullanıcı tarafından girilen değerin 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 bir CompareValidator ekleyin. Bu değişikliklere ek olarak, UnitPrice değerini sağa hizalamak veya UnitPrice metnin biçimlendirmesini salt okunurdur ve Düzenle arabirimlerinde belirtmek gibi herhangi bir Aesthetic Characteristics değişikliğini gerçekleştirmeye başlayabilirsiniz.

GridView s akıllı etiketinde düzenleme etkinleştir onay kutusunu işaretleyerek GridView 'ı düzenlenebilir hale getirin. Ayrıca, Sayfalamayı Etkinleştir ve sıralamayı etkinleştir onay kutularını işaretleyin.

Note

GridView s Editing arabirimini nasıl özelleştireceğinizi gözden geçirmeniz gerekiyor mu? Bu durumda, veri değiştirme arabirimi öğreticisini özelleştirmeye geri bakın.

Düzen, sıralama ve sayfalama için GridView desteğini etkinleştirmek

Şekil 6: düzen, sıralama ve sayfalama Için GridView desteğini etkinleştirin (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 'un bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır:

<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 bir ürünün adını, kategorisini ve fiyatını listeler. En kısa süre içinde sonuçları sıralayın, bu işlem içindeki sayfaları düzenleyin ve bir kaydı düzenleyin.

Her ürün adı, kategori ve fiyat sıralanabilir, disk belleğine alınabilir, düzenlenebilir bir GridView 'da listelenmiştir

Şekil 7: her ürün adı, kategori ve fiyat sıralanabilir, disk belleğine alınan, 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 'un verileri ne zaman Istediğini Inceleme

GridView Products, ProductsDataSource ObjectDataSource 'un Select yöntemini çağırarak verileri görüntülenecek şekilde alır. Bu ObjectDataSource, Iş mantığı katmanı s ProductsBLL sınıfının bir örneğini oluşturur ve GetProducts() yöntemini çağırır ve bu da veri erişim katmanı s ProductsTableAdapter s GetProducts() yöntemini çağırır. DAL yöntemi, Northwind veritabanına bağlanır ve yapılandırılmış SELECT sorgusunu yayınlar. Bu veriler daha sonra DAL olarak döndürülür ve bir NorthwindDataTable. DataTable nesnesi BLL 'e döndürülür. Bu, bunu GridView 'a döndüren ObjectDataSource öğesine döndürür. GridView daha sonra DataTable 'daki her bir DataRow için bir GridViewRow nesnesi oluşturur ve her GridViewRow sonunda istemciye döndürülen ve ziyaretçi tarayıcısı üzerinde görüntülenen HTML 'de işlenir.

Bu olay dizisi her biri ve GridView 'un temel alınan verilerine bağlanması gereken her seferinde oluşur. Sayfa ilk kez ziyaret edildiğinde, bir veri sayfasından diğerine geçiş yaparken, GridView sıralandığında veya GridView s verilerini yerleşik düzenleme veya silme arabirimleri aracılığıyla değiştirirken meydana gelir. GridView s görünüm durumu devre dışıysa, GridView her bir ve her geri göndermede de yeniden bağlanacaktır. GridView Ayrıca DataBind() yöntemi çağırarak verilerine açıkça yeniden bağlanabilir.

Verilerin veritabanından alındığı sıklığı tam olarak görmek için, verilerin ne zaman yeniden alındığını belirten bir ileti görüntülenmesini sağlayın. ODSEventsadlı GridView 'un üstüne bir etiket Web denetimi ekleyin. Text özelliğini temizleyin ve EnableViewState özelliğini falseolarak ayarlayın. Etiketin altına bir Button Web Control ekleyin ve Text özelliğini postback olarak ayarlayın.

GridView 'un üzerindeki sayfaya bir etiket ve düğme eklemek

Şekil 8: GridView 'un üzerindeki sayfaya bir etiket ve düğme ekleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri erişimi iş akışı sırasında, ObjectDataSource Selecting olayı temel alınan nesne oluşturulmadan ve yapılandırılan Yöntem çağrılmadan önce ateşlenir. 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 bir veri için mimariye bir istek yaptığında, etiket tetiklenen olayı seçen metin görüntülenir.

Bu sayfayı bir tarayıcıda ziyaret edin. Sayfa ilk kez ziyaret edildiğinde, tetiklenen olayı seçen metin gösterilir. Geri gönder düğmesine tıklayın ve metnin kaybolduğunu unutmayın (GridView s EnableViewState özelliğinin true, varsayılan) olarak ayarlandığı varsayılır. Bunun nedeni, geri göndermede GridView 'un görünüm durumundan yeniden yapılandırılmış olması ve bu nedenle verileri için ObjectDataSource 'e geri gönderilmesi. Ancak verileri sıralama, sayfalama veya düzenlemenin yanı sıra GridView 'un veri kaynağına yeniden bağlanmasına neden olur ve bu nedenle olay harekete geçen metin seçimi yeniden belirir.

GridView, veri kaynağına her bağlandığında tetiklenen olay seçildiğinde görüntülenir

Şekil 9: GridView 'un veri kaynağına yeniden bağlanması durumunda tetiklenen olayı seçme görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Geri gönderme düğmesine tıklamak GridView 'un görünüm durumundan yeniden oluşturulmasına neden olur

Şekil 10: geri gönderme düğmesine tıklamak GridView 'un görünüm durumundan yeniden oluşturulmasına neden olur (tam boyutlu görüntüyü görüntülemek için tıklayın)

Verilerin her sayfalanışında veya sıralandığında veritabanı verilerinin alınması beklenebilir görünebilir. Bu yana, varsayılan sayfalama 'yı kullanmaya başladıktan sonra, ilk sayfa görüntülenirken ObjectDataSource tüm kayıtları almıştır. GridView sıralama ve sayfalama desteği sağlamasa bile, sayfa her kullanıcı tarafından ilk kez ziyaret edildiğinde (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ılar için aynı verileri gösteriyorsa, bu ek veritabanı istekleri gereksiz olur. GetProducts() yönteminden döndürülen sonuçları önbelleğe alma ve GridView 'i bu önbelleğe alınmış sonuçlara bağlama.

4. Adım: ObjectDataSource kullanarak verileri önbelleğe alma

Yalnızca birkaç özelliği ayarlayarak, ObjectDataSource, alınan verilerini ASP.NET veri önbelleğinde otomatik olarak önbelleğe almak üzere yapılandırılabilir. Aşağıdaki liste, ObjectDataSource 'un önbellekte ilgili özelliklerini özetler:

  • Önbelleğe almayı etkinleştirmek için EnableCaching 'nin true olarak ayarlanması gerekir. Varsayılan, false değeridir.
  • CacheDuration , verilerin önbelleğe alınma süresi (saniye cinsinden). Varsayılan değer, 0'dur. ObjectDataSource yalnızca EnableCaching true ve CacheDuration sıfırdan büyük bir değere ayarlandıysa verileri önbelleğe alacak.
  • CacheExpirationPolicy , Absolute veya Slidingolarak ayarlanabilir. Absolute, ObjectDataSource CacheDuration saniye boyunca alınan verilerini önbelleğe alır; Sliding, verilerin süresi yalnızca CacheDuration saniye boyunca erişilmedi. Varsayılan, Absolute değeridir.
  • CacheKeyDependency bu özelliği, ObjectDataSource s önbellek girişlerini varolan bir önbellek bağımlılığı ile ilişkilendirmek için kullanın. ObjectDataSource 'un veri girişleri, ilişkili CacheKeyDependencysüresi dolduğunda önbellekten erken çıkartık olabilir. Bu özellik en yaygın olarak SQL önbellek bağımlılıkları öğreticisini kullanarak keşfedediğimiz bir konu olan ObjectDataSource s Cache ile SQL önbellek bağımlılığını ilişkilendirmek için kullanılır.

ProductsDataSource ObjectDataSource 'ı, verileri mutlak ölçekte 30 saniye önbellekte önbelleğe almak üzere yapılandıralım. ObjectDataSource EnableCaching özelliğini true ve CacheDuration özelliğini 30 olarak ayarlayın. CacheExpirationPolicy özelliğini varsayılan, Absoluteolarak bırakın.

, verileri 30 saniye önbellekte önbelleğe almak için yapılandırın

Şekil 11: ObjectDataSource 'ı verileri 30 saniye önbellekte önbelleğe almak üzere yapılandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Değişikliklerinizi kaydedin ve bu sayfayı bir tarayıcıda yeniden ziyaret edin. İlk olarak veri önbellekte olmadığında, sayfayı ilk kez ziyaret ettiğinizde başlatılan olay seçme metni görüntülenir. Ancak geri gönderme düğmesine tıklanarak, sıralama, sayfalama veya Düzenle ya da Iptal düğmelerini tıklatmak ile tetiklenen sonraki geri göndermeler, başlatılan olay harekete geçirilmiş metni yeniden görüntülemez . Bunun nedeni, Selecting olayının yalnızca ObjectDataSource temel nesnesinden verileri aldığında harekete geçirilir; veriler veri önbelleğinden çekilmezse Selecting olay harekete geçmeyecektir.

30 saniye sonra, veriler önbellekten çıkarılacaktır. Insert, Updateveya Delete yöntemleri çağrılırsa, veriler önbellekten de çıkartılecektir. Sonuç olarak, 30 saniye geçtikten sonra veya güncelleştirme düğmesine tıklandıktan sonra, sıralama, sayfalama veya Düzenle ya da Iptal düğmelerini tıklatmak, ObjectDataSource 'un verileri temel nesnesinden almasını sağlar ve bu da Selecting olay tetiklendiğinde çalıştırılan olayı Seçme metnini görüntüler. Döndürülen bu sonuçlar veri önbelleğine geri yerleştirilir.

Note

Çalışan olay harekete geçen metni sık sık görürseniz, ObjectDataSource 'un önbelleğe alınmış verilerle çalışmasını bekleseniz bile, bu durum Bellek kısıtlamalarından kaynaklanıyor olabilir. Yeterli boş bellek yoksa, ObjectDataSource tarafından önbelleğe eklenen veriler de atılabilir. ObjectDataSource, verileri doğru önbelleğe alma veya yalnızca verileri önbelleğe alma gibi görünmesine gerek yoksa belleği boşaltmak için bazı uygulamaları kapatın ve yeniden deneyin.

Şekil 12, ObjectDataSource 'un önbelleğe alma iş akışını gösterir. Ekranda seçme olayı harekete geçirildiğinde metin görüntülendiğinde, verilerin önbellekte olmaması ve temel alınan nesneden alınması gerekiyordu. Ancak bu metin eksik olduğunda, veriler önbellekten kullanılabilir olduğundan,. Veriler önbellekten döndürüldüğünde, temel alınan nesneye hiçbir çağrı yapılmaz ve bu nedenle veritabanı sorgusu yürütülmez.

ObjectDataSource verileri veri önbelleğinden depolar ve alır

Şekil 12: ObjectDataSource, verileri veri önbelleğinden depolar ve alır

Her bir ASP.NET uygulamasının, tüm sayfalar ve ziyaretçiler genelinde paylaştığı kendi veri önbelleği örneği vardır. Diğer bir deyişle, ObjectDataSource tarafından veri önbelleğinde depolanan veriler aynı şekilde sayfayı ziyaret eden tüm kullanıcılar arasında paylaşılır. Bunu doğrulamak için ObjectDataSource.aspx sayfasını bir tarayıcıda açın. Sayfa ilk kez ziyaret edildiğinde, başlatılan olayı seçme metni görüntülenir (önceki testlerin önbelleğine eklenen verilerin şu anda çıkarıldığını varsayarak). İkinci bir tarayıcı örneği açın ve ilk tarayıcı örneğinden ikincisine URL 'YI kopyalayın ve yapıştırın. İkinci tarayıcı örneğinde, ilk olarak aynı önbelleğe alınmış verileri kullandığından, olay harekete geçen metin seçme metni gösterilmez.

Alınan veriler önbelleğe eklenirken, ObjectDataSource, CacheDuration ve CacheExpirationPolicy özellik değerlerini içeren bir önbellek anahtarı değeri kullanır; TypeName özelliği Ile belirtilen ObjectDataSource tarafından kullanılan temeldeki iş nesnesinin türü (ProductsBLL, bu örnekte); SelectMethod özelliğinin değeri ve SelectParameters koleksiyonundaki parametrelerin adı ve değerleri; ve StartRowIndex ve MaximumRows özelliklerinin, Özel sayfalama uygularken kullanılan değerleri.

Bu özelliklerin bir birleşimi olarak önbellek anahtarı değerinin oluşturulması, bu değerler değiştikçe benzersiz bir önbellek girişi sağlar. Örneğin, geçmiş öğreticilerde, belirtilen bir kategori için tüm ürünleri döndüren ProductsBLL sınıf s GetProductsByCategoryID(categoryID)kullanmaya baktık. Tek bir kullanıcı sayfaya gelebilir ve 1 CategoryID olan meşruleri görüntüleyebilir. ObjectDataSource, SelectParameters değerleri dikkate almadan sonuçlarını önbelleğe alıyorsa, içgörüler ürünleri önbellekte olduğu sürece, başka bir kullanıcı da sayfaya geldiğinde, büyük/küçük ürünler yerine önbelleğe alınmış içecek ürünlerini görürler. SelectParametersdeğerleri de dahil olmak üzere bu özelliklere göre önbellek anahtarını değiştirerek, ObjectDataSource, içecek ve koşullu kaynaklar için ayrı bir önbellek girişi tutar.

Eski veri konuları

Insert, Updateveya Delete yöntemlerinin herhangi biri çağrıldığında, ObjectDataSource öğeleri önbellekten otomatik olarak çıkarır. Bu, veriler sayfa aracılığıyla değiştirildiğinde önbellek girişlerini temizleyerek eski verilere karşı korumaya yardımcı olur. Ancak, önbelleğe alma kullanan bir ObjectDataSource, eski verileri görüntülemeye devam etmek için mümkündür. En basit durumda, bunun nedeni doğrudan veritabanı içinde değişen veri olabilir. Belki de bir veritabanı Yöneticisi veritabanındaki bazı kayıtları değiştiren bir betiği çalıştırdı.

Bu senaryo, daha hafif bir şekilde katlamayı de kaldırır. ObjectDataSource, veri değiştirme yöntemlerinden biri çağrıldığında öğeleri önbellekten çıkarlarken, kaldırılan önbelleğe alınmış öğeler, özellik değerlerinin (CacheDuration, TypeName, SelectMethodvb.) belirli bir birleşimine yöneliktir. Farklı SelectMethods veya SelectParameterskullanan, ancak yine de aynı verileri güncelleştirebilecek iki ObjectDataSources varsa, bir ObjectDataSource bir satırı güncelleştirebilir ve kendi önbellek girişlerini geçersiz kılabilir, ancak ikinci ObjectDataSource için karşılık gelen satır, hala önbelleğe alınmış olarak sunulur. Bu işlevi gösteren sayfalar oluşturmanızı teşvik ediyorum. Verilerini önbelleğe alma kullanan bir ObjectDataSource 'tan alıp ProductsBLL sınıf s GetProducts() yönteminden veri almak üzere yapılandırılmış bir düzenlenebilir GridView görüntüleyen bir sayfa oluşturun. Bu sayfaya (veya başka bir tane) başka bir düzenlenebilir GridView ve ObjectDataSource ekleyin, ancak bu ikinci ObjectDataSource için GetProductsByCategoryID(categoryID) yöntemini kullanın. İki ObjectDataSources SelectMethod özellikleri farklı olduğundan, bunların her biri kendi önbelleğe alınmış değerlerine sahiptir. Bir ürünü tek bir kılavuzda düzenlerseniz, daha sonra verileri diğer kılavuza geri bağladığınızda (sayfalama, sıralama vb.), yine de eski, önbelleğe alınmış verilere sahip olur ve diğer kılavuzdan yapılan değişikliği yansıtmaz.

Kısacası, yalnızca eski verilerin potansiyelini sağlamak istiyorsanız zaman tabanlı expiries kullanın ve verilerin yeniliği önemli olan senaryolar için daha kısa expiries kullanın. Eski veriler kabul edilebilir değilse, ya da SQL önbellek bağımlılıklarını kullanın veya (yeniden önbelleğe aldığınız veritabanı verileri olduğu varsayılarak). Gelecek bir öğreticide SQL önbellek bağımlılıklarını araştıracağız.

Özet

Bu öğreticide, ObjectDataSource 'ın yerleşik önbelleğe alma yeteneklerini inceliyoruz. Yalnızca birkaç özelliği ayarlayarak, ObjectDataSource 'a belirtilen SelectMethod döndürülen sonuçları ASP.NET veri önbelleğine önbelleğe almak için talimat vereceğiz. CacheDuration ve CacheExpirationPolicy özellikleri, öğenin önbelleğe alındığı süreyi ve mutlak veya kayan bir süre sonu olup olmadığını gösterir. CacheKeyDependency özelliği, tüm ObjectDataSource 'lar önbellek girdilerini varolan bir önbellek bağımlılığı ile ilişkilendirir. Bu, zaman tabanlı süre sonuna ulaşılmadan önce ObjectDataSource 'un girişlerini önbellekten çıkarmak için kullanılabilir ve genellikle SQL önbellek bağımlılıklarıyla birlikte kullanılır.

ObjectDataSource, değerlerini veri önbelleğine yalnızca önbelleğe aldığından, ObjectDataSource 'ın yerleşik işlevselliğini programlı bir şekilde çoğaltabiliriz. Bu, ObjectDataSource bu işlevselliği kutudan çıkar, ancak bir mimarinin ayrı bir katmanında önbelleğe alma özelliği uygulayabiliriz. Bunu yapmak için, ObjectDataSource tarafından kullanılan mantığı tekrarlamanız gerekecektir. Sonraki öğreticimizde mimarideki veri önbelleğiyle programlı olarak nasıl çalışacağımız anlatılmaktadır.

Programlamanın kutlu olsun!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister. mitchell@4GuysFromRolla.comadresinden erişilebilir . ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.

Özel olarak teşekkürler

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi. Bu öğretici için müşteri adayı gözden geçireni bir Murphy idi. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .