SQL Önbellek Bağımlılıklarını Kullanma (C#)

tarafından Scott Mitchell

PDF’yi İndir

En basit önbelleğe alma stratejisi, önbelleğe alınan verilerin belirli bir süre sonra süresinin dolmasına izin vermektir. Ancak bu basit yaklaşım, önbelleğe alınan verilerin temel veri kaynağıyla hiçbir ilişki korumaması ve bunun sonucunda çok uzun süre tutulan eski veriler veya süresi çok erken dolan geçerli veriler olduğu anlamına gelir. SqlCacheDependency sınıfını kullanarak temel alınan veriler SQL veritabanında değiştirilene kadar verilerin önbelleğe alınmış olarak kalmasını sağlamak daha iyi bir yaklaşımdır. Bu öğretici nasıl yapılacağını gösterir.

Giriş

Mimari öğreticilerindeki ObjectDataSource ile Verileri Önbelleğe Alma ve Verileri Önbelleğe Alma bölümünde incelenen önbelleğe alma teknikleri, verileri belirli bir süre sonunda önbellekten çıkarmak için zamana bağlı bir süre sonu kullandı. Bu yaklaşım, önbelleğe almanın performans kazançlarını veri eskime durumuyla dengelemenin en basit yoludur. X saniyelik bir süre sonu seçerek, sayfa geliştiricisi yalnızca x saniye boyunca önbelleğe almanın performans avantajlarından yararlanmaya devam eder, ancak verilerinin hiçbir zaman en fazla x saniyeden uzun süre eskimeyeceğinden rahatlayabilir. Elbette, statik veriler için x , Uygulama Başlangıcında Verileri Önbelleğe Alma öğreticisinde incelendiği gibi web uygulamasının ömrüne uzatılabilir.

Veritabanı verilerini önbelleğe alırken, kullanım kolaylığı için genellikle zamana bağlı bir süre sonu seçilir, ancak genellikle yetersiz bir çözümdür. İdeal olarak, veritabanı verileri veritabanında temel alınan veriler değiştirilene kadar önbelleğe alınmış olarak kalır; yalnızca o zaman önbellek çıkarılır. Bu yaklaşım önbelleğe almanın performans avantajlarını en üst düzeye çıkarır ve eski verilerin süresini en aza indirir. Ancak, bu avantajlardan yararlanmak için, temel alınan veritabanı verilerinin ne zaman değiştirildiğini bilen ve karşılık gelen öğeleri önbellekten çıkaran bir sistem olması gerekir. ASP.NET 2.0'a başlamadan önce sayfa geliştiricileri bu sistemi uygulamaktan sorumlulardı.

ASP.NET 2.0, veritabanında bir değişikliğin ne zaman gerçekleştiğini belirlemek için bir SqlCacheDependency sınıf ve gerekli altyapıyı sağlar, böylece karşılık gelen önbelleğe alınmış öğeler çıkarılabilir. Temel alınan verilerin ne zaman değiştiğini belirlemek için iki teknik vardır: bildirim ve yoklama. Bildirim ve yoklama arasındaki farkları inceledikten sonra yoklamayı desteklemek için gereken altyapıyı oluşturacak ve ardından sınıfın SqlCacheDependency bildirim temelli ve programlı senaryolarda nasıl kullanılacağını keşfedeceğiz.

Bildirim ve Yoklamayı Anlama

Veritabanındaki verilerin ne zaman değiştirildiğini belirlemek için kullanılabilecek iki teknik vardır: bildirim ve yoklama. Bildirim ile veritabanı, sorgunun son yürütülmesinden bu yana belirli bir sorgunun sonuçları değiştirildiğinde ASP.NET çalışma zamanını otomatik olarak uyarır ve bu noktada sorguyla ilişkili önbelleğe alınmış öğeler çıkarılır. Yoklama ile veritabanı sunucusu belirli tabloların en son ne zaman güncelleştirildiğini gösterir. ASP.NET çalışma zamanı, önbelleğe girildiğinden beri hangi tabloların değiştiğini denetlemek için veritabanını düzenli aralıklarla yoklar. Verileri değiştirilmiş olan tabloların ilişkili önbellek öğeleri çıkarılmıştır.

Bildirim seçeneği yoklamadan daha az kurulum gerektirir ve değişiklikleri tablo düzeyinde değil sorgu düzeyinde izlediğinden daha ayrıntılıdır. Ne yazık ki bildirimler yalnızca Microsoft SQL Server 2005'in (Express olmayan sürümler) tam sürümlerinde kullanılabilir. Ancak yoklama seçeneği Microsoft SQL Server'nin 7.0 ile 2005 arasında tüm sürümleri için kullanılabilir. Bu öğreticilerde SQL Server 2005'in Express sürümü kullanıldığından, yoklama seçeneğini ayarlamaya ve kullanmaya odaklanacağız. SQL Server 2005 bildirim özellikleri hakkında daha fazla kaynak için bu öğreticinin sonundaki Daha Fazla Okuma bölümüne bakın.

Yoklama ile veritabanı üç sütunu olan adlı AspNet_SqlCacheTablesForChangeNotification bir tablo içerecek şekilde yapılandırılmalıdır: tableName, notificationCreatedve changeId. Bu tablo, web uygulamasında sql önbellek bağımlılığında kullanılması gerekebilecek verilerin bulunduğu her tablo için bir satır içerir. tableName sütun tablonun adını belirtirkennotificationCreated, satırın tabloya eklendiği tarih ve saati belirtir. Sütun changeId türündedir int ve başlangıç değeri 0'dır. Tablodaki her değişiklikle değeri artırılır.

Tabloya AspNet_SqlCacheTablesForChangeNotification ek olarak, veritabanının sql önbellek bağımlılığında görünebilecek tabloların her birine tetikleyiciler de eklemesi gerekir. Bu tetikleyiciler bir satır eklendiğinde, güncelleştirildiğinde veya silindiğinde yürütülür ve içindeki AspNet_SqlCacheTablesForChangeNotificationtablonun changeId değerini artırır.

ASP.NET çalışma zamanı, bir nesneyi kullanarak SqlCacheDependency verileri önbelleğe alırken tablonun geçerli changeId durumunu izler. Veritabanı düzenli aralıklarla denetleniyor ve veritabanındaki değerden farklı olan changeId tüm SqlCacheDependency nesneler çıkarılıyor çünkü farklı changeId bir değer, veriler önbelleğe alındıktan sonra tabloda bir değişiklik olduğunu gösteriyor.

1. Adım: Komut Satırı Programını Keşfetmeaspnet_regsql.exe

Yoklama yaklaşımıyla veritabanının yukarıda açıklanan altyapıyı içerecek şekilde ayarlanması gerekir: önceden tanımlanmış bir tablo (AspNet_SqlCacheTablesForChangeNotification), bir dizi saklı yordam ve web uygulamasındaKI SQL önbellek bağımlılıklarında kullanılabilecek tabloların her birinde tetikleyiciler. Bu tablolar, saklı yordamlar ve tetikleyiciler klasöründe bulunan $WINDOWS$\Microsoft.NET\Framework\version komut satırı programı aspnet_regsql.exearacılığıyla oluşturulabilir. Tabloyu ve ilişkili saklı yordamları oluşturmak AspNet_SqlCacheTablesForChangeNotification için komut satırından aşağıdakileri çalıştırın:

/* For SQL Server authentication... */
aspnet_regsql.exe -S server -U user -P password -d database -ed
/* For Windows Authentication... */
aspnet_regsql.exe -S server -E -d database -ed

Not

Bu komutları yürütmek için belirtilen veritabanı oturum açma bilgilerinin ve db_ddladmin rollerinde db_securityadmin olması gerekir.

Örneğin, Yoklama altyapısını Windows Kimlik Doğrulaması kullanarak adlı bir veritabanı sunucusundaki ScottsServer adlı pubs Microsoft SQL Server veritabanına eklemek için uygun dizine gidin ve komut satırında şunu girin:

aspnet_regsql.exe -S ScottsServer -E -d pubs -ed

Veritabanı düzeyinde altyapı eklendikten sonra tetikleyicileri SQL önbellek bağımlılıklarında kullanılacak tablolara eklememiz gerekir. aspnet_regsql.exe Komut satırı programını yeniden kullanın, ancak anahtarı kullanarak -t tablo adını belirtin ve anahtarı kullanmak -ed yerine şunu kullanın-et:

/* For SQL Server authentication... */
aspnet_regsql.exe -S <i>server</i>
-U <i>user</i> -P <i>password</i> -d <i>database</i> -t <i>tableName</i> -et
/* For Windows Authentication... */
aspnet_regsql.exe -S <i>server</i>
-E -d <i>database</i> -t <i>tableName</i> -et

tetikleyicilerini veritabanındaki authorsScottsServerve titles tablolarına pubs eklemek için şunu kullanın:

aspnet_regsql.exe -S ScottsServer -E -d pubs -t authors -et
aspnet_regsql.exe -S ScottsServer -E -d pubs -t titles -et

Bu öğretici için tetikleyicileri , Categoriesve Suppliers tablolarına Productsekleyin. 3. Adımda belirli bir komut satırı söz dizimine bakacağız.

2. Adım: microsoft SQL Server 2005 Express Sürüm veritabanına başvurmaApp_Data

Komut aspnet_regsql.exe satırı programı, gerekli yoklama altyapısını eklemek için veritabanı ve sunucu adını gerektirir. Ancak klasörde bulunan App_Data bir Microsoft SQL Server 2005 Express veritabanının veritabanı ve sunucu adı nedir? Veritabanı ve sunucu adlarını bulmak yerine, en basit yaklaşımın veritabanını veritabanı localhost\SQLExpress örneğine eklemek ve SQL Server Management Studio kullanarak verileri yeniden adlandırmak olduğunu buldum. Makinenizde SQL Server 2005'in tam sürümlerinden biri yüklüyse, büyük olasılıkla bilgisayarınızda zaten SQL Server Management Studio yüklüdür. Yalnızca Express sürümüne sahipseniz ücretsiz Microsoft SQL Server Management Studio Express Edition'ı indirebilirsiniz.

Visual Studio'yu kapatarak başlayın. Ardından SQL Server Management Studio açın ve Windows Kimlik Doğrulaması'nı kullanarak sunucuya bağlanmayı localhost\SQLExpress seçin.

localhost\SQLExpress Sunucusuna ekleme

Şekil 1: Sunucuya localhost\SQLExpress Ekleme

Sunucuya bağlandıktan sonra, Management Studio sunucuyu gösterir ve veritabanları, güvenlik vb. için alt klasörlere sahiptir. Veritabanları klasörüne sağ tıklayın ve Ekle seçeneğini belirleyin. Bu, Veritabanlarını Ekle iletişim kutusunu açar (bkz. Şekil 2). Ekle düğmesine tıklayın ve web uygulamanızın NORTHWND.MDFApp_Data klasöründeki veritabanı klasörünü seçin.

NORTHWND'i ekleyin. App_Data Klasöründen MDF Veritabanı

Şekil 2: Klasördeki NORTHWND.MDFApp_Data Veritabanını Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu işlem veritabanını Veritabanları klasörüne ekler. Veritabanı adı, veritabanı dosyasının tam yolu veya GUID ile ekli tam yol olabilir. aspnet_regsql.exe komut satırı aracını kullanırken bu uzun veritabanı adını yazmak zorunda kalmamak için, yeni eklenen veritabanına sağ tıklayıp Yeniden Adlandır'ı seçerek veritabanını daha kolay bir adla yeniden adlandırın. Veritabanımı DataTutorials olarak yeniden adlandırdım.

Ekli Veritabanını Daha Human-Friendly Bir Adla Yeniden Adlandırma

Şekil 3: Ekli Veritabanını Daha Human-Friendly Bir Adla Yeniden Adlandırın

3. Adım: Yoklama Altyapısını Northwind Veritabanına Ekleme

Artık veritabanını klasörden NORTHWND.MDF eklediğimize App_Data göre yoklama altyapısını eklemeye hazırız. Veritabanını DataTutorials olarak yeniden adlandırdığınız varsayıldığında aşağıdaki dört komutu çalıştırın:

aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -ed
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -t Products -et
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -t Categories -et
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -t Suppliers -et

Bu dört komutu çalıştırdıktan sonra Management Studio'da veritabanı adına sağ tıklayın, Görevler alt menüsüne gidin ve Ayır'ı seçin. Ardından Management Studio'yu kapatın ve Visual Studio'yu yeniden açın.

Visual Studio yeniden açıldıktan sonra Sunucu Gezgini aracılığıyla veritabanında detaya gidin. Yeni tabloya (AspNet_SqlCacheTablesForChangeNotification ), yeni saklı yordamlara ve , Categoriesve Suppliers tablolarındaki Productstetikleyicilere dikkat edin.

Veritabanı artık gerekli yoklama altyapısını içerir

Şekil 4: Veritabanı artık gerekli yoklama altyapısını içerir

4. Adım: Yoklama Hizmetini Yapılandırma

Veritabanında gerekli tabloları, tetikleyicileri ve saklı yordamları oluşturduktan sonra son adım, kullanılacak veritabanlarını ve yoklama sıklığını milisaniye cinsinden belirterek gerçekleştirilen Web.config yoklama hizmetini yapılandırmaktır. Aşağıdaki işaretleme, Northwind veritabanını saniyede bir kez yoklar.

<?xml version="1.0"?>
<configuration>
   <connectionStrings>
      <add name="NORTHWNDConnectionString" connectionString=
          "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NORTHWND.MDF;
           Integrated Security=True;User Instance=True" 
           providerName="System.Data.SqlClient"/>
   </connectionStrings>
   <system.web>
      ...
      <!-- Configure the polling service used for SQL cache dependencies -->
      <caching>
         <sqlCacheDependency enabled="true" pollTime="1000" >
            <databases>
               <add name="NorthwindDB" 
                    connectionStringName="NORTHWNDConnectionString" />
            </databases>
         </sqlCacheDependency>
      </caching>
   </system.web>
</configuration>

name öğesindeki <add> ( NorthwindDB ) değer, insan tarafından okunabilir bir adı belirli bir veritabanıyla ilişkilendirir. SQL önbellek bağımlılıklarıyla çalışırken burada tanımlanan veritabanı adına ve önbelleğe alınan verilerin temel alındığı tabloya başvurmamız gerekir. 6. Adımda SQL önbellek bağımlılıklarını önbelleğe alınmış verilerle program aracılığıyla ilişkilendirmek için sınıfının nasıl kullanılacağını SqlCacheDependency göreceğiz.

SQL önbellek bağımlılığı oluşturulduktan sonra yoklama sistemi milisaniyede bir öğelerde <databases> tanımlanan veritabanlarına bağlanır ve saklı yordamı yürütürAspNet_SqlCachePollingStoredProcedure.pollTime 3. Adım'da komut satırı aracı kullanılarak aspnet_regsql.exe geri eklenen bu saklı yordam, içindeki AspNet_SqlCacheTablesForChangeNotificationher kayıt için ve changeId değerlerini döndürürtableName. Eski SQL önbellek bağımlılıkları önbellekten çıkarılır.

Bu pollTime ayar, performans ve veri eskime durumu arasında bir denge sağlar. Küçük pollTime bir değer veritabanına yapılan istek sayısını artırır, ancak eski verileri önbellekten daha hızlı bir şekilde kaldırır. Daha büyük pollTime bir değer veritabanı isteklerinin sayısını azaltır, ancak arka uç verilerinin değişmesi ile ilgili önbellek öğelerinin çıkarılması arasındaki gecikmeyi artırır. Neyse ki veritabanı isteği basit ve basit bir tablodan yalnızca birkaç satır döndüren basit bir saklı yordam yürütmektedir. Ancak veritabanı erişimi ile uygulamanız için veri eskime durumu arasında ideal bir denge bulmak için farklı pollTime değerlerle denemeler yapın. İzin verilen en pollTime küçük değer 500'dür.

Not

Yukarıdaki örnek öğesinde tek pollTime bir değer sağlar, ancak isteğe bağlı olarak öğesindeki <add> değeri belirtebilirsinizpollTime.<sqlCacheDependency> Belirtilen birden çok veritabanınız varsa ve veritabanı başına yoklama sıklığını özelleştirmek istiyorsanız bu yararlı olur.

5. Adım: SQL Önbelleği Bağımlılıklarıyla Bildirimli Olarak Çalışma

1- 4. Adımlarda gerekli veritabanı altyapısını ayarlamayı ve yoklama sistemini yapılandırmayı inceledik. Bu altyapı mevcutken, artık programlı veya bildirim temelli teknikleri kullanarak ilişkili sql önbelleği bağımlılığıyla veri önbelleğine öğeler ekleyebiliriz. Bu adımda SQL önbellek bağımlılıklarıyla bildirim temelli olarak nasıl çalışacağımızı inceleyeceğiz. 6. Adımda programlı yaklaşıma göz atacağız.

ObjectDataSource ile Verileri Önbelleğe Alma öğreticisi, ObjectDataSource'un bildirim temelli önbelleğe alma özelliklerini keşfetti. Yalnızca özelliğini ve CacheDuration özelliğini true bir zaman aralığına ayarlayarakEnableCaching, ObjectDataSource belirtilen aralık için temel nesnesinden döndürülen verileri otomatik olarak önbelleğe alır. ObjectDataSource bir veya daha fazla SQL önbellek bağımlılığı da kullanabilir.

SQL önbellek bağımlılıklarını bildirimli olarak kullanmayı göstermek için, klasördeki Caching sayfayı açın SqlCacheDependencies.aspx ve Toolbox'tan Tasarım Aracı bir GridView sürükleyin. GridView'u IDProductsDeclarative olarak ayarlayın ve akıllı etiketinden adlı yeni bir ObjectDataSource'a ProductsDataSourceDeclarativebağlamayı seçin.

ProductsDataSourceDeclarative Adlı Yeni Bir ObjectDataSource Oluşturma

Şekil 5: Adlı ProductsDataSourceDeclarative Yeni Bir ObjectDataSource Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sınıfını kullanmak ProductsBLL için ObjectDataSource'ı yapılandırın ve SELECT sekmesindeki açılan listeyi olarak GetProducts()ayarlayın. GÜNCELLE sekmesinde, üç giriş parametresiyle UpdateProduct aşırı yüklemeyi seçin: productName, unitPriceve productID. INSERT ve DELETE sekmelerinde açılan listeleri (Hiçbiri) olarak ayarlayın.

Üç Giriş Parametresiyle UpdateProduct Aşırı Yüklemesini Kullanma

Şekil 6: Üç Giriş Parametresiyle UpdateProduct Aşırı Yüklemesini Kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

INSERT ve DELETE Sekmeleri için Drop-Down Listesini (Yok) olarak ayarlayın

Şekil 7: INSERT ve DELETE Sekmeleri için Drop-Down Listesini (Yok) olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri Kaynağını Yapılandırma sihirbazını tamamladıktan sonra Visual Studio, veri alanlarının her biri için GridView'da BoundFields ve CheckBoxFields oluşturur. , , CategoryNameve dışında ProductNametüm alanları kaldırın ve UnitPricebu alanları uygun gördüğünüz şekilde biçimlendirin. GridView'un akıllı etiketinde Sayfalandırmayı Etkinleştir, Sıralamayı Etkinleştir ve Düzenlemeyi Etkinleştir onay kutularını işaretleyin. Visual Studio, ObjectDataSource özelliğini OldValuesParameterFormatString olarak original_{0}ayarlar. GridView düzenleme özelliğinin düzgün çalışması için, bu özelliği bildirim temelli söz diziminden tamamen kaldırın veya varsayılan değerine geri ayarlayın. {0}

Son olarak, GridView'un üzerine bir Label Web denetimi ekleyin ve özelliğini ODSEvents olarak ve EnableViewState özelliğini olarak falseayarlayınID. Bu değişiklikleri yaptıktan sonra sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır. GridView alanlarında SQL önbellek bağımlılığı işlevselliğini göstermek için gerekli olmayan bir dizi estetik özelleştirme yaptığıma dikkat edin.

<asp:Label ID="ODSEvents" runat="server" EnableViewState="False" />
<asp:GridView ID="ProductsDeclarative" runat="server" 
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="ProductsDataSourceDeclarative" 
    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:RequiredFieldValidator ID="RequiredFieldValidator1" 
                    ControlToValidate="ProductName" Display="Dynamic" 
                    ErrorMessage="You must provide a name for the product." 
                    SetFocusOnError="True"
                    runat="server">*</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" 
                    Text='<%# Bind("ProductName") %>' />
            </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" runat="server" 
                    ControlToValidate="UnitPrice"
                    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" Display="Dynamic" 
                    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="ProductsDataSourceDeclarative" runat="server" 
    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>

Ardından, ObjectDataSource Selecting olayı için bir olay işleyicisi oluşturun ve içine aşağıdaki kodu ekleyin:

protected void ProductsDataSourceDeclarative_Selecting
    (object sender, ObjectDataSourceSelectingEventArgs e)
{
    ODSEvents.Text = "-- Selecting event fired";
}

ObjectDataSource Selecting olayının yalnızca temel alınan nesneden veri alınırken tetiklendiğini hatırlayın. ObjectDataSource verilere kendi önbelleğinden erişiyorsa, bu olay tetiklenmez.

Şimdi bu sayfayı bir tarayıcı üzerinden ziyaret edin. Henüz önbelleğe alma işlemi gerçekleştirmediğimizden, kılavuza her sayfa eklediğinizde, sıralama yaptığınızda veya düzenlediğinizde sayfa, Şekil 8'de gösterildiği gibi 'Olay tetiklendi seçeneğini belirleme) metnini görüntülemelidir.

GridView Her Sayfalandığında, Düzenlendiğinde veya Sıralandığında ObjectDataSource'un Seçme Olayı Tetikleniyor

Şekil 8: GridView Her Sayfalandığında, Düzenlendiğinde veya Sıralandığında ObjectDataSource Selecting Olayı Tetikleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource ile Verileri Önbelleğe Alma öğreticisinde gördüğümüz gibi, özelliğini true olarak ayarlamak EnableCaching ObjectDataSource'un verileri özelliği tarafından belirtilen süre boyunca önbelleğe almasına CacheDuration neden olur. ObjectDataSource'un ayrıca, deseni kullanarak önbelleğe alınan verilere bir veya daha fazla SQL önbellek bağımlılığı ekleyen bir SqlCacheDependency özelliği de vardır:

databaseName1:tableName1;databaseName2:tableName2;...

Burada databaseName, içindeki öğesinin Web.configözniteliğinde name belirtilen veritabanının <add> adı, tableName ise veritabanı tablosunun adıdır. Örneğin, Northwind Products tablosuna karşı SQL önbellek bağımlılığını temel alarak verileri süresiz olarak önbelleğe alan bir ObjectDataSource oluşturmak için ObjectDataSource EnableCaching özelliğini true olarak ve SqlCacheDependency özelliğini NorthwindDB:Products olarak ayarlayın.

Not

sql önbellek bağımlılığını ve zaman tabanlı süre sonunu, zaman aralığınatrueCacheDuration, veritabanı ve SqlCacheDependency tablo adlarına ayarlayarak EnableCaching kullanabilirsiniz. ObjectDataSource, zamana bağlı süre sonuna ulaşıldığında veya yoklama sistemi temel alınan veritabanı verilerinin değiştiğini (hangisi önce gerçekleşirse) not ettiğinde verilerini çıkaracaktır.

içindeki SqlCacheDependencies.aspx GridView iki tablodan Products (ve Categories ) verileri görüntüler (ürün CategoryName alanı üzerinde Categoriesaracılığıyla JOIN alınır). Bu nedenle, iki SQL önbelleği bağımlılığı belirtmek istiyoruz: NorthwindDB:Products; NorthwindDB:Kategoriler .

Ürünlerde ve Kategorilerde SQL Önbelleği Bağımlılıklarını Kullanarak ObjectDataSource'ı Önbelleğe Almayı Destekleyecek Şekilde Yapılandırma

Şekil 9: ve üzerinde ProductsCategories SQL Önbelleği Bağımlılıklarını Kullanarak Önbelleğe Almayı Desteklemek için ObjectDataSource'ı Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

ObjectDataSource'ı önbelleğe almayı destekleyecek şekilde yapılandırdıktan sonra, sayfayı bir tarayıcı üzerinden yeniden ziyaret edin. Yeniden, 'Olay seçildiğinde ilk sayfa ziyaretinde görünmelidir, ancak Düzenle veya İptal düğmelerine sayfalama, sıralama veya tıklama sırasında kaldırılmalıdır. Bunun nedeni, veriler ObjectDataSource önbelleğine yüklendikten sonra veya Categories tabloları değiştirilene Products veya GridView aracılığıyla güncelleştirilene kadar orada kalmasıdır.

Kılavuzda sayfalama yaptıktan ve 'Olay tetiklenen metin seçiliyor' ifadesinin eksik olduğunu belirttikten sonra yeni bir tarayıcı penceresi açın ve Düzenleme, Ekleme ve Silme bölümündeki Temel bilgiler öğreticisine gidin (~/EditInsertDelete/Basics.aspx). Bir ürünün adını veya fiyatını güncelleştirin. Ardından, ilk tarayıcı penceresinden farklı bir veri sayfası görüntüleyin, kılavuzu sıralayın veya bir satırın Düzenle düğmesine tıklayın. Bu kez, temel alınan veritabanı verileri değiştirildiğinden 'Tetiklenen olay seçme yeniden gösterilmelidir (bkz. Şekil 10). Metin görünmüyorsa, birkaç dakika bekleyin ve yeniden deneyin. Yoklama hizmetinin her milisaniyede tabloda pollTime yapılan değişiklikleri Products denetlediğini unutmayın. Bu nedenle, temel alınan verilerin güncelleştirilmesi ile önbelleğe alınan verilerin çıkarılması arasında bir gecikme yaşanır.

Ürünler Tablosunun Değiştirilmesi Önbelleğe Alınan Ürün Verilerini Kaldırır

Şekil 10: Ürünler Tablosunu Değiştirmek Önbelleğe Alınan Ürün Verilerini Çıkartır (Tam boyutlu görüntüyü görüntülemek için tıklayın)

6. Adım: Program Aracılığıyla SınıflaSqlCacheDependencyÇalışma

Mimarideki Verileri Önbelleğe Alma öğreticisi, önbelleğe alma işlemini ObjectDataSource ile sıkı bir şekilde bağlamanın aksine mimaride ayrı bir Önbelleğe Alma Katmanı kullanmanın avantajlarını inceledi. Bu öğreticide, veri önbelleğiyle program aracılığıyla çalışmayı göstermek için bir ProductsCL sınıf oluşturduk. Önbelleğe Alma Katmanında SQL önbellek bağımlılıklarını kullanmak için sınıfını SqlCacheDependency kullanın.

Yoklama sistemiyle, bir SqlCacheDependency nesnenin belirli bir veritabanı ve tablo çiftiyle ilişkilendirilmesi gerekir. Örneğin aşağıdaki kod, Northwind veritabanı Products tablosunu temel alan bir SqlCacheDependency nesne oluşturur:

Caching.SqlCacheDependency productsTableDependency = 
    new Caching.SqlCacheDependency("NorthwindDB", "Products");

s oluşturucusunun SqlCacheDependency iki giriş parametresi sırasıyla veritabanı ve tablo adlarıdır. ObjectDataSource özelliğinde SqlCacheDependency olduğu gibi, kullanılan veritabanı adı içindeki Web.configöğesinin özniteliğinde name belirtilen değerle <add> aynıdır. Tablo adı, veritabanı tablosunun gerçek adıdır.

Bir SqlCacheDependency öğeyi veri önbelleğine eklenen bir öğeyle ilişkilendirmek için, bağımlılığı kabul eden yöntem aşırı yüklemelerinden birini Insert kullanın. Aşağıdaki kod belirsiz bir süre için veri önbelleğine değer ekler, ancak tablodaki Products ile SqlCacheDependency ilişkilendirir. Kısacası , bellek kısıtlamaları nedeniyle veya yoklama sistemi tablonun önbelleğe alındıktan sonra değiştiğini algıladığından Products çıkarılana kadar değer önbellekte kalır.

Caching.SqlCacheDependency productsTableDependency = 
    new Caching.SqlCacheDependency("NorthwindDB", "Products");
Cache.Insert(key, 
             value, 
             productsTableDependency, 
             System.Web.Caching.Cache.NoAbsoluteExpiration, 
             System.Web.Caching.Cache.NoSlidingExpiration);

Önbelleğe Alma Katmanı sınıfı ProductsCL şu anda zaman tabanlı 60 saniyelik bir süre sonu kullanarak tablodaki Products verileri önbelleğe alır. Şimdi bu sınıfı SQL önbellek bağımlılıklarını kullanacak şekilde güncelleştirelim. Verileri ProductsCL önbelleğe eklemekten sorumlu olan sınıfın AddCacheItem yöntemi şu anda aşağıdaki kodu içerir:

private void AddCacheItem(string rawKey, object value)
{
    System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
    // Make sure MasterCacheKeyArray[0] is in the cache
    DataCache[MasterCacheKeyArray[0]] = DateTime.Now;
    // Add a CacheDependency
    Caching.CacheDependency dependency =
        new Caching.CacheDependency(null, MasterCacheKeyArray);
    DataCache.Insert(GetCacheKey(rawKey), value, dependency, 
        DateTime.Now.AddSeconds(CacheDuration), 
        System.Web.Caching.Cache.NoSlidingExpiration);
}

Bu kodu önbellek bağımlılığı yerine bir SqlCacheDependency nesne kullanacak şekilde güncelleştirin MasterCacheKeyArray :

private void AddCacheItem(string rawKey, object value)
{
    System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
    // Add the SqlCacheDependency objects for Products
    Caching.SqlCacheDependency productsTableDependency = 
        new Caching.SqlCacheDependency("NorthwindDB", "Products");
    // Add the item to the data cache using productsTableDependency
    DataCache.Insert(GetCacheKey(rawKey), value, productsTableDependency, 
        Caching.Cache.NoAbsoluteExpiration, Caching.Cache.NoSlidingExpiration);
}

Bu işlevi test etmek için, mevcut ProductsDeclarative GridView'un altındaki sayfaya bir GridView ekleyin. Bu yeni GridView'ı IDProductsProgrammatic olarak ayarlayın ve akıllı etiketi aracılığıyla adlı yeni bir ObjectDataSource'a ProductsDataSourceProgrammaticbağlayın. ObjectDataSource'ı sınıfını kullanacak ProductsCL şekilde yapılandırın ve SELECT ve UPDATE sekmelerindeki açılan listeleri sırasıyla ve UpdateProductolarak GetProducts ayarlayın.

ObjectDataSource'ı ProductsCL Sınıfını Kullanacak Şekilde Yapılandırma

Şekil 11: ObjectDataSource'ı Sınıfı Kullanacak ProductsCL Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

SELECT Sekmesinin Drop-Down Listesinden GetProducts Yöntemini seçin

Şekil 12: SELECT Sekmesinin GetProducts Drop-Down Listesinden Yöntemi seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

UPDATE Sekmesinin Drop-Down Listesinden UpdateProduct Yöntemini seçin

Şekil 13: GÜNCELLEŞTİr sekmesindeki Drop-Down Listesinden UpdateProduct Yöntemini seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri Kaynağını Yapılandırma sihirbazını tamamladıktan sonra Visual Studio, veri alanlarının her biri için GridView'da BoundFields ve CheckBoxFields oluşturur. Bu sayfaya eklenen ilk GridView'da olduğu gibi, , CategoryNameve dışında ProductNametüm alanları kaldırın ve UnitPricebu alanları uygun gördüğünüz şekilde biçimlendirin. GridView'un akıllı etiketinde Sayfalandırmayı Etkinleştir, Sıralamayı Etkinleştir ve Düzenlemeyi Etkinleştir onay kutularını işaretleyin. ObjectDataSource'ta ProductsDataSourceDeclarative olduğu gibi Visual Studio da ObjectDataSource özelliğini OldValuesParameterFormatString olarak original_{0}ayarlarProductsDataSourceProgrammatic. GridView düzenleme özelliğinin düzgün çalışması için bu özelliği olarak ayarlayın {0} (veya özellik atamasını bildirim temelli söz diziminden tamamen kaldırın).

Bu görevleri tamamladıktan sonra, sonuçta elde edilen GridView ve ObjectDataSource bildirim temelli işaretleme aşağıdaki gibi görünmelidir:

<asp:GridView ID="ProductsProgrammatic" runat="server" 
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="ProductsDataSourceProgrammatic" 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:RequiredFieldValidator ID="RequiredFieldValidator1"  
                    ControlToValidate="ProductName" Display="Dynamic" 
                    ErrorMessage="You must provide a name for the product." 
                    SetFocusOnError="True"
                    runat="server">*</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" 
                    Text='<%# Bind("ProductName") %>' />
            </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" runat="server" 
                    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" 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="ProductsDataSourceProgrammatic" runat="server" 
    OldValuesParameterFormatString="{0}" SelectMethod="GetProducts" 
    TypeName="ProductsCL" UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Önbelleğe Alma Katmanı'nda SQL önbelleği bağımlılığını test etmek için sınıfının AddCacheItem yönteminde ProductCL bir kesme noktası ayarlayın ve hata ayıklamaya başlayın. öğesini ilk kez ziyaret SqlCacheDependencies.aspxettiğinizde, veriler ilk kez istendiği ve önbelleğe yerleştirildiği için kesme noktasına isabet edilmesi gerekir. Ardından GridView'da başka bir sayfaya gidin veya sütunlardan birini sıralayın. Bu, GridView'un verilerini yeniden sorgulamasına neden olur, ancak veritabanı tablosu değiştirilmediğinden verilerin önbellekte Products bulunması gerekir. Veriler tekrar tekrar önbellekte bulunamazsa, bilgisayarınızda yeterli bellek olduğundan emin olun ve yeniden deneyin.

GridView'un birkaç sayfasında sayfalama yaptıktan sonra ikinci bir tarayıcı penceresi açın ve Düzenleme, Ekleme ve Silme bölümündeki Temel bilgiler öğreticisine gidin (~/EditInsertDelete/Basics.aspx). Ürünler tablosundan bir kaydı güncelleştirin ve ilk tarayıcı penceresinde yeni bir sayfa görüntüleyin veya sıralama üst bilgilerinden birine tıklayın.

Bu senaryoda iki şeyden birini görürsünüz: kesme noktasına isabet edilir ve veritabanındaki değişiklik nedeniyle önbelleğe alınan verilerin çıkarıldığını gösterir; veya kesme noktasına isabet edilmeyecektir; yani SqlCacheDependencies.aspx artık eski veriler gösteriliyordur. Kesme noktasına isabet edilmemesi, büyük olasılıkla veriler değiştirildikten sonra yoklama hizmetinin henüz tetiklenmemiş olmasıdır. Yoklama hizmetinin tabloda pollTime yapılan değişiklikleri Products milisaniyede bir denetlediğini unutmayın. Bu nedenle, temel alınan verilerin güncelleştirilmesi ile önbelleğe alınan verilerin çıkarılması arasında bir gecikme olur.

Not

Bu gecikme, içindeki GridView SqlCacheDependencies.aspxaracılığıyla ürünlerden birini düzenlerken daha olasıdır. Mimaride Verileri Önbelleğe Alma öğreticisinde, sınıfın MasterCacheKeyArrayUpdateProduct yöntemi aracılığıyla ProductsCL düzenlenen verilerin önbellekten çıkarıldığından emin olmak için önbellek bağımlılığını ekledik. Ancak, bu adımın AddCacheItem önceki bölümlerinde yöntemini değiştirirken bu önbellek bağımlılığını değiştirdik ve bu nedenle ProductsCL yoklama sistemi tablodaki değişikliği Products not edene kadar sınıfı önbelleğe alınmış verileri göstermeye devam edecektir. 7. Adımda önbellek bağımlılığını MasterCacheKeyArray yeniden nasıl yeniden başlatacağımızı göreceğiz.

7. Adım: Birden Çok Bağımlılığı Önbelleğe Alınmış Bir Öğeyle İlişkileştirme

Önbellek bağımlılığının MasterCacheKeyArray , içinde ilişkili tek bir öğe güncelleştirildiğinde ürünle ilgili tüm verilerin önbellekten çıkarıldığından emin olmak için kullanıldığını hatırlayın. Örneğin, GetProductsByCategoryID(categoryID) yöntemi her benzersiz categoryID değeri için örnekleri önbelleğe alırProductsDataTables. Bu nesnelerden biri çıkarılırsa, MasterCacheKeyArray önbellek bağımlılığı diğerlerinin de kaldırılmasını sağlar. Bu önbellek bağımlılığı olmadan, önbelleğe alınan veriler değiştirildiğinde önbelleğe alınan diğer ürün verilerinin güncel olma olasılığı vardır. Sonuç olarak, SQL önbellek bağımlılıklarını kullanırken önbellek bağımlılığını MasterCacheKeyArray korumamız önemlidir. Ancak, veri önbelleğinin Insert yöntemi yalnızca tek bir bağımlılık nesnesine izin verir.

Ayrıca, SQL önbellek bağımlılıklarıyla çalışırken birden çok veritabanı tablosunu bağımlılık olarak ilişkilendirmemiz gerekebilir. Örneğin, ProductsDataTable sınıfında önbelleğe alınan ProductsCL , her ürünün kategorisini ve sağlayıcı adlarını içerir, ancak AddCacheItem yöntemi yalnızca bağımlılığını Productskullanır. Bu durumda, kullanıcı bir kategorinin veya sağlayıcının adını güncelleştirirse, önbelleğe alınan ürün verileri önbellekte kalır ve güncelliğini yitirmiş olur. Bu nedenle, önbelleğe alınan ürün verilerini yalnızca Products tabloya değil, ve Suppliers tablolarına Categories da bağımlı hale getirmek istiyoruz.

AggregateCacheDependency sınıfı, birden çok bağımlılığı bir önbellek öğesiyle ilişkilendirmek için bir araç sağlar. Örnek AggregateCacheDependency oluşturarak başlayın. Ardından, s Add yöntemini kullanarak AggregateCacheDependency bağımlılık kümesini ekleyin. Bundan sonra öğeyi veri önbelleğine eklerken örneği geçirin AggregateCacheDependency . Örneğin bağımlılıklarından herhangi biri AggregateCacheDependency değiştiğinde, önbelleğe alınan öğe çıkarılır.

Sınıfın yöntemi için ProductsCLAddCacheItem güncelleştirilmiş kod aşağıda gösterilmiştir. yöntemi, , Categoriesve Suppliers tablolarının MasterCacheKeyArray nesneleriyle SqlCacheDependencyProductsbirlikte önbellek bağımlılığını oluşturur. Bunların tümü adlı aggregateDependenciestek bir AggregateCacheDependency nesnede birleştirilir ve ardından yöntemine Insert geçirilir.

private void AddCacheItem(string rawKey, object value)
{
    System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
    // Make sure MasterCacheKeyArray[0] is in the cache and create a depedency
    DataCache[MasterCacheKeyArray[0]] = DateTime.Now;
    Caching.CacheDependency masterCacheKeyDependency = 
        new Caching.CacheDependency(null, MasterCacheKeyArray);
    // Add the SqlCacheDependency objects for Products, Categories, and Suppliers
    Caching.SqlCacheDependency productsTableDependency = 
        new Caching.SqlCacheDependency("NorthwindDB", "Products");
    Caching.SqlCacheDependency categoriesTableDependency = 
        new Caching.SqlCacheDependency("NorthwindDB", "Categories");
    Caching.SqlCacheDependency suppliersTableDependency = 
        new Caching.SqlCacheDependency("NorthwindDB", "Suppliers");
    // Create an AggregateCacheDependency
    Caching.AggregateCacheDependency aggregateDependencies = 
        new Caching.AggregateCacheDependency();
    aggregateDependencies.Add(masterCacheKeyDependency, productsTableDependency, 
        categoriesTableDependency, suppliersTableDependency);
    DataCache.Insert(GetCacheKey(rawKey), value, aggregateDependencies, 
        Caching.Cache.NoAbsoluteExpiration, Caching.Cache.NoSlidingExpiration);
}

Bu yeni kodu test edin. Artık , Categoriesveya Suppliers tablolarında yapılan değişiklikler Productsönbelleğe alınan verilerin çıkarılmasına neden olur. Ayrıca, ProductsCL GridView aracılığıyla bir ürünü düzenlerken çağrılan sınıf UpdateProduct yöntemi önbellek bağımlılığını çıkarır MasterCacheKeyArray ve bu da önbelleğe alınan ProductsDataTable verilerin bir sonraki istekte yeniden alınmasına neden olur.

Not

SQL önbellek bağımlılıkları çıkış önbelleğe alma ile de kullanılabilir. Bu işlevselliğin bir gösterimi için bkz. SQL Server ile ASP.NET Çıktı Önbelleği kullanma.

Özet

Veritabanı verileri önbelleğe alınırken, veriler veritabanında değiştirilene kadar ideal olarak önbellekte kalır. ASP.NET 2.0 ile SQL önbellek bağımlılıkları hem bildirim temelli hem de programlı senaryolarda oluşturulabilir ve kullanılabilir. Bu yaklaşımın zorluklarından biri, verilerin ne zaman değiştirildiğini bulmaktır. Microsoft SQL Server 2005'in tam sürümleri, bir sorgu sonucu değiştiğinde uygulamayı uyarabilen bildirim özellikleri sağlar. SQL Server 2005'in Express Sürümü ve SQL Server'ın eski sürümleri için bunun yerine bir yoklama sistemi kullanılmalıdır. Neyse ki gerekli yoklama altyapısını ayarlamak oldukça basittir.

Mutlu Programlama!

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

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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Marko Rangel, Teresa Murphy ve Hilton Giesenow oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.