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
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 olan bağlantısını korumadığı anlamına gelir ve bayat verilerin çok uzun süre saklanmasına veya güncel verilerin erkenden geçersizleşmesine yol açar. 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 kılavuz size nasıl yapacağınızı gösterir.
Giriş
Mimari öğreticilerinde ObjectDataSource ile Verileri Önbelleğe Alma ve Verileri Önbelleğe Alma öğreticilerinde incelenmiş olan önbelleğe alma teknikleri, verileri belirli bir süre sonunda önbellekten çıkarmak için zamana dayalı bir sona erme süresi kullandı. Bu yaklaşım, önbelleğe alma performansını veri eskime durumuyla dengelemenin en basit yoludur. X saniyelik 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ği için rahat olabilir. 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ı verileri önbelleğe alındığında, kullanım kolaylığı için genellikle zaman tabanlı 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 mevcut olmalıdır. ASP.NET 2.0'a başlamadan önce sayfa geliştiricileri bu sistemi uygulamaktan sorumlulardı.
ASP.NET 2.0, veritabanında ilgili önbelleğe alınmış öğelerin çıkarılabilmesi için ne zaman bir değişiklik olduğunu belirlemek için bir SqlCacheDependency sınıf ve gerekli altyapıyı sağlar. 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 gerekli altyapıyı oluşturacak ve ardından sınıfı bildirim temelli ve programlı senaryolarda nasıl kullanacağınızı SqlCacheDependency keşfedeceğiz.
Bildirim ve Anket Sürecini 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ılı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 tam sürümlerinde (express olmayan sürümler) kullanılabilir. Ancak yoklama seçeneği, Microsoft SQL Server'ın 7.0 ile 2005 arasında tüm sürümleri için kullanılabilir. Bu öğreticiler SQL Server 2005'in Express sürümünü kullandığı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ı, adlı üç sütunu olan bir tablo AspNet_SqlCacheTablesForChangeNotification 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 verileri içeren her tablo için bir satır içerir.
tableName Sütun, tablonun adını belirtirken notificationCreated 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ünebilen 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 changeIdtablonun AspNet_SqlCacheTablesForChangeNotification değerini artırır.
ASP.NET çalıştırma zamanlayıcısı, bir changeId nesnesi kullanarak verileri önbellekte saklarken tablonun geçerli SqlCacheDependency durumunu izler. Veritabanı düzenli aralıklarla denetlenır ve veritabanındaki değerden farklı olan SqlCacheDependency nesneler changeId çıkarılır çünkü farklı changeId bir değer, veriler önbelleğe alındıktan sonra tabloda bir değişiklik olduğunu gösterir.
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ında SQL önbellek bağımlılıklarında kullanılabilecek tabloların her birinde tetikleyiciler. Bu tablolar, saklı yordamlar ve tetikleyiciler, klasöründe bulunan aspnet_regsql.exe komut satırı programı $WINDOWS$\Microsoft.NET\Framework\versionaracılığıyla oluşturulabilir. Tabloyu ve ilişkili saklı yordamları oluşturmak için AspNet_SqlCacheTablesForChangeNotification 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
Uyarı
Bu komutları yürütmek için, belirtilen veritabanı oturum açmanın db_securityadmin ve db_ddladmin rollerinde olması gerekir.
Örneğin, Windows Kimlik Doğrulaması kullanarak, adı pubs olan bir veritabanı sunucusundaki adı ScottsServer olan Microsoft SQL Server veritabanına sorgulama altyapısını eklemek için uygun dizine gidin ve komut satırından ş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 -t anahtarını kullanarak tablo adını belirtin ve -ed anahtarını kullanmak yerine -et kullanın, örneğin:
/* 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
authors üzerindeki titles veritabanındaki pubs ve ScottsServer tablolarına tetikleyicileri 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 Products, Categories ve Suppliers tablolarına ekleyin. 3. Adımda belirli komut satırı söz dizimine göz atacağız.
2. Adım: Microsoft SQL Server 2005 Express Edition 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 zorunda kalmak yerine, en basit yaklaşımın veritabanını veritabanı örneğine localhost\SQLExpress 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 SQL Server Management Studio yüklüdür. Yalnızca Express sürümüne sahipseniz ücretsiz Microsoft SQL Server Management Studio'yu indirebilirsiniz.
Visual Studio'yu kapatarak başlayın. Ardından SQL Server Management Studio'yu açın ve Windows Kimlik Doğrulaması'nı kullanarak sunucuya bağlanmayı localhost\SQLExpress seçin.
Şekil 1: Sunucuya localhost\SQLExpress Bağlanma
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.
Şekil 2: Veritabanını Klasörden NORTHWND.MDFApp_Data 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.
Şekil 3: Ekli Veritabanını Daha Human-Friendly Bir Adla Yeniden Adlandırma
3. Adım: Northwind Veritabanına Yoklama Altyapısı Ekleme
Artık NORTHWND.MDF klasöründen veritabanını App_Data eklediğimize göre, anket 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 Products, Categories ve Suppliers tablolarındaki tetikleyicilere dikkat edin.
Ş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 kod, Northwind veritabanını saniyede bir kontrol eder.
<?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> değer ( NorthwindDB ), 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 her <databases> milisaniyede bir pollTime öğelerinde tanımlanan veritabanlarına bağlanır ve AspNet_SqlCachePollingStoredProcedure saklı yordamını yürütür. Bu saklı yordam - 3. Adım'da aspnet_regsql.exe komut satırı aracı kullanılarak eklenen - tableName içindeki her kayıt için changeId ve AspNet_SqlCacheTablesForChangeNotification değerlerini döndürür. 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 yönelik istek sayısını artırır, ancak eski verileri önbellekten daha hızlı bir şekilde çıkartı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 hafif bir tablodan sadece birkaç satır döndüren basit bir saklı yordam yürütmektedir. Ancak, veritabanı erişimi ve 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.
Uyarı
Yukarıdaki örnek, pollTime öğesinde tek bir <sqlCacheDependency> değeri sağlar, ancak isteğe bağlı olarak pollTime öğesinde <add> değerini belirtebilirsiniz. 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 Önbellek Bağımlılıklarıyla Bildirim temelli Ç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 inceledi. Yalnızca EnableCaching özelliğini True olarak ayarlayıp CacheDuration özelliğini belirli bir zaman aralığına ayarlayarak, ObjectDataSource temel nesnesinden döndürülen verileri belirtilen aralık için 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, SqlCacheDependencies.aspx klasöründeki Caching sayfasını açın ve Araç Kutusu'ndan bir GridView'i Tasarımcı'ya sürükleyin. GridView'u IDProductsDeclarative olarak ayarlayın ve, akıllı etiketinden bunu adlı ProductsDataSourceDeclarativeyeni bir ObjectDataSource'a bağlamayı seçin.
Şekil 5: Adlı ProductsDataSourceDeclarative Yeni Bir ObjectDataSource Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
ObjectDataSource'ı ProductsBLL sınıfını kullanacak şekilde yapılandırın ve SELECT sekmesindeki açılan listeyi GetProducts() için ayarlayın. GÜNCELLE sekmesinde, üç giriş parametresiyle aşırı yüklemeyi seçin UpdateProduct : productName, unitPriceve productID. INSERT ve DELETE sekmelerinde açılan listeleri (Yok) olarak ayarlayın.
Şekil 6: UpdateProduct Aşırı Yüklemesini Üç Giriş Parametresiyle Kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 7: INSERT ve DELETE Sekmeleri için Drop-Down Listesi'ni (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.
ProductName, CategoryName ve UnitPrice dışındaki tüm alanları kaldırın ve bu 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'ın OldValuesParameterFormatString özelliğini original_{0} olarak 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 ID özelliğini ODSEvents, EnableViewState özelliğini False olarak ayarlayın. 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 Sub ProductsDataSourceDeclarative_Selecting _
(sender As Object, e As ObjectDataSourceSelectingEventArgs) _
Handles ProductsDataSourceDeclarative.Selecting
ODSEvents.Text = "-- Selecting event fired"
End Sub
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ılavuzu her sayfaladığınızda, sıraladığınızda veya düzenlediğinizde, sayfa 'Seçim olayı tetiklendi, Şekil 8'de gösterildiği gibi' metnini görüntülemelidir.
Şekil 8: GridView her sayfalandığında, düzenlendiğinde veya sıralandığında ObjectDataSource'un 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ğinin EnableCaching olarak ayarlanması True ObjectDataSource'un kendi özelliği tarafından belirtilen süre boyunca verilerini önbelleğe almasına CacheDuration neden olur. ObjectDataSource'un bir özelliği de vardır SqlCacheDependencyve bu özellik, deseni kullanarak önbelleğe alınan verilere bir veya daha fazla SQL önbellek bağımlılığı ekler:
databaseName1:tableName1;databaseName2:tableName2;...
Burada databaseName, içindeki öğesinin nameözniteliğinde <add> belirtildiği gibi veritabanının Web.config adıdır ve tableName 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'un EnableCaching özelliğini True olarak ve SqlCacheDependency özelliğini NorthwindDB:Products olarak ayarlayın.
Uyarı
SQL cache bağımlılığını ve zaman bazlı sona erme süresini ayarlamak için EnableCaching'i True, CacheDuration'ü zaman aralığına, SqlCacheDependency'ü ise veritabanı ve tablo adına ayarlayarak kullanabilirsiniz. ObjectDataSource, zamana bağlı süre sonu geldiğinde 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 veri görüntüler: Products ve Categories (ürünün CategoryName alanı JOIN aracılığıyla bir Categories ile getirilir). Bu nedenle, iki SQL önbellek bağımlılığı belirtmek istiyoruz: NorthwindDB:Products; NorthwindDB:Categories .
Şekil 9: Products ve Categories üzerinde SQL Önbellek Bağımlılıklarını Kullanarak ObjectDataSource'u Önbelleğe Almayı Destekleyecek Şekilde 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. Yine, ilk sayfa ziyaretinde 'Olay seçme işlemi tetikleniyor' metni görünmelidir, ancak bu metin sayfalama, sıralama veya Düzenle veya İptal düğmelerine tıklama sırasında kaldırılmalıdır. Bunun nedeni, veriler ObjectDataSource önbelleğine yüklendikten sonra, Products veya Categories tabloları değiştirilene ya da GridView aracılığıyla güncelleştirilene kadar orada kalmasıdır.
Kılavuzda gezindikten ve 'Seçim etkinliği tetiklendi' metninin eksik olduğunu belirledikten sonra, yeni bir tarayıcı penceresi açın ve Düzenleme, Ekleme ve Silme bölümündeki Temel Bilgiler öğreticisine (~/EditInsertDelete/Basics.aspx) gidin. 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 sefer, altta yatan veritabanı verileri değiştirildiğinden, 'Seçme olayı tetiklenmelidir' ifadesi yeniden görünmelidir (bkz. Şekil 10). Metin görünmüyorsa, birkaç dakika bekleyin ve yeniden deneyin. Yoklama hizmetinin tabloda Products her milisaniyede bir değişiklik pollTime olup olmadığını 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.
Şekil 10: Ürünler Tablosunun Değiştirilmesi Ö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: Programatik Olarak Sınıfla Çalışma
Mimari öğreticisindeki 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. Veri önbelleğiyle program aracılığıyla çalışmayı göstermek için bu öğreticide 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 nesne belirli bir veritabanı ve tablo çiftiyle ilişkilendirilmelidir. Örneğin aşağıdaki kod, Northwind veritabanı SqlCacheDependency tablosunu temel alan bir Products nesne oluşturur:
Dim productsTableDependency As _
New Caching.SqlCacheDependency("NorthwindDB", "Products")
s oluşturucusunun SqlCacheDependency iki giriş parametresi sırasıyla veritabanı ve tablo adlarıdır. ObjectDataSource özelliğindeki SqlCacheDependency gibi, kullanılan veritabanı adı, name içindeki <add> öğesinin Web.config özniteliğinde belirtilen değerle aynıdır. Tablo adı, veritabanı tablosunun gerçek adıdır.
Bir SqlCacheDependency öğesini 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, süresiz bir süre için veri önbelleğine değer ekler, ancak tablodaki SqlCacheDependency ile Products ilişkilendirir. Kısacası, değer, bellek kısıtlamaları nedeniyle atılana kadar veya yoklama sistemi, Products tablonun önbelleğe alındıktan sonra değiştiğini algıladığı için önbellekte kalır.
Dim productsTableDependency As _
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. Bunun yerine SQL önbellek bağımlılıklarını kullanacak şekilde bu sınıfı güncelleştirelim. Verileri ProductsCL önbelleğe eklemekten sorumlu olan s sınıfı AddCacheItem yöntemi şu anda aşağıdaki kodu içerir:
Private Sub AddCacheItem(ByVal rawKey As String, ByVal value As Object)
Dim DataCache As System.Web.Caching.Cache = HttpRuntime.Cache
' Make sure MasterCacheKeyArray(0) is in the cache - if not, add it
If DataCache(MasterCacheKeyArray(0)) Is Nothing Then
DataCache(MasterCacheKeyArray(0)) = DateTime.Now
End If
' Add a CacheDependency
Dim dependency As _
New Caching.CacheDependency(Nothing, MasterCacheKeyArray)
DataCache.Insert(GetCacheKey(rawKey), value, dependency, _
DateTime.Now.AddSeconds(CacheDuration), _
Caching.Cache.NoSlidingExpiration)
End Sub
Bu kodu önbellek bağımlılığı yerine bir SqlCacheDependency nesne kullanacak şekilde güncelleştirin MasterCacheKeyArray :
Private Sub AddCacheItem(ByVal rawKey As String, ByVal value As Object)
Dim DataCache As System.Web.Caching.Cache = HttpRuntime.Cache
' Add the SqlCacheDependency objects for Products
Dim productsTableDependency As New _
Caching.SqlCacheDependency("NorthwindDB", "Products")
DataCache.Insert(GetCacheKey(rawKey), value, productsTableDependency, _
Cache.NoAbsoluteExpiration, Caching.Cache.NoSlidingExpiration)
End Sub
Bu işlevi test etmek için mevcut ProductsDeclarative GridView'un altındaki sayfaya bir GridView ekleyin. Bu yeni GridView s ID değerini ProductsProgrammatic olarak ayarlayın ve akıllı etiketi aracılığıyla bunu ProductsDataSourceProgrammatic adlı yeni bir ObjectDataSource'a bağlayın. ObjectDataSource'ı ProductsCL sınıfını kullanacak şekilde yapılandırın. SELECT ve UPDATE sekmelerindeki açılan listeleri sırasıyla GetProducts ve UpdateProduct olarak ayarlayın.
Ş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)
Ş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)
Şekil 13: UPDATE Sekmesinin 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, , ProductNameve dışında CategoryNametü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’taki ProductsDataSourceDeclarative gibi ProductsDataSourceProgrammatic özelliğini OldValuesParameterFormatString olarak original_{0} ayarlar. GridView düzenleme özelliğinin düzgün çalışması için bu özelliği olarak yeniden {0} ayarlayın (veya bildirim temelli söz diziminden özellik atamasını tamamen kaldırın).
Bu görevleri tamamladıktan sonra, ortaya çıkan 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 önbellek bağımlılığını test etmek için sınıfın ProductCLAddCacheItem yönteminde bir kesme noktası ayarlayın ve hata ayıklamaya başlayın. İlk kez SqlCacheDependencies.aspx öğesini ziyaret ettiğinizde, veriler talep edilir ve önbelleğe yerleştirilirken durma noktası tetiklenir. 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 önbellekte tekrar tekrar 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 (~/EditInsertDelete/Basics.aspx) gidin. Ü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 ulaşılır ve bunun anlamı, önbelleğe alınan verilerin veritabanındaki değişiklik nedeniyle önbellekten çıkarıldığını gösterir; veya kesme noktasına ulaşılamayacak, yani SqlCacheDependencies.aspx artık eski veriler gösterdiği anlamına gelir. 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 Products her milisaniyede bir değişiklik pollTime olup olmadığını 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.
Uyarı
Bu gecikme, içindeki GridView SqlCacheDependencies.aspxaracılığıyla ürünlerden birini düzenlerken daha olasıdır.
Mimarideki Verileri Önbelleğe Alma öğreticisi kapsamında, MasterCacheKeyArray sınıfındaki ProductsCLUpdateProduct yöntemi aracılığıyla düzenlenen verilerin önbellekten çıkarıldığını garanti etmek için önbellek bağımlılığını ekledik. Ancak, bu adımda AddCacheItem yöntemini değiştirirken bu önbellek bağımlılığını değiştirdik ve bu nedenle ProductsCL sınıfı, yoklama sistemi Products tablosundaki değişikliği fark edene kadar önbelleğe alınmış verileri göstermeye devam edecektir. 7. Adımda önbellek bağımlılığını nasıl yeniden sağlayacağı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 ProductsDataTables alır. 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ınmış diğer ürün verilerinin güncel olmayabileceği 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ği s 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 için kategori ve sağlayıcı adlarını içerir, ancak AddCacheItem yöntemi yalnızca üzerinde Productsbir bağımlılık kullanı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 tablosuna değil, aynı zamanda Categories ve Suppliers tablolarına da bağımlı hale getirmek istiyoruz.
sınıfı, AggregateCacheDependency 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 AggregateCacheDependency yöntemini kullanarak Add bağımlılık kümesini ekleyin. Bundan sonra öğeyi veri önbelleğine eklerken AggregateCacheDependency örneğini geçirin.
örneğinin bağımlılıklarından AggregateCacheDependency değiştiğinde, önbelleğe alınan öğe silinir.
ProductsCL sınıfının AddCacheItem yöntemine ait güncellenmiş kod aşağıda gösterilmektedir. Yöntem, MasterCacheKeyArray, SqlCacheDependency ve Products tablolarının nesneleriyle birlikte Categories önbellek bağımlılığını oluşturur Suppliers. Bunların tümü AggregateCacheDependency adlı tek bir aggregateDependencies nesnede birleştirilir ve ardından Insert yöntemine geçirilir.
Private Sub AddCacheItem(ByVal rawKey As String, ByVal value As Object)
Dim DataCache As System.Web.Caching.Cache = HttpRuntime.Cache
' Make sure MasterCacheKeyArray(0) is in the cache - if not, add it.
If DataCache(MasterCacheKeyArray(0)) Is Nothing Then
DataCache(MasterCacheKeyArray(0)) = DateTime.Now
End If
'Create the CacheDependency
Dim masterCacheKeyDependency As _
New Caching.CacheDependency(Nothing, MasterCacheKeyArray)
' Add the SqlCacheDependency objects for Products, Categories, and Suppliers
Dim productsTableDependency As _
New Caching.SqlCacheDependency("NorthwindDB", "Products")
Dim categoriesTableDependency As _
New Caching.SqlCacheDependency("NorthwindDB", "Categories")
Dim suppliersTableDependency As _
New Caching.SqlCacheDependency("NorthwindDB", "Suppliers")
' Create an AggregateCacheDependency
Dim aggregateDependencies As New Caching.AggregateCacheDependency()
aggregateDependencies.Add(masterCacheKeyDependency, productsTableDependency, _
categoriesTableDependency, suppliersTableDependency)
DataCache.Insert(GetCacheKey(rawKey), value, aggregateDependencies, _
Caching.Cache.NoAbsoluteExpiration, Caching.Cache.NoSlidingExpiration)
End Sub
Bu yeni kodu test edin. Artık , Productsveya Categories tablolarında yapılan değişiklikler Suppliersönbelleğe alınan verilerin çıkarılmasına neden oluyor. Ayrıca, ProductsCL sınıfının UpdateProduct yöntemi, GridView aracılığıyla bir ürünü düzenlerken çağrılır ve bu yöntem MasterCacheKeyArray önbellek bağımlılığını kaldırarak önbelleğe alınan verinin ProductsDataTable tahliye edilmesine ve verinin bir sonraki istekte yeniden alınmasına neden olur.
Uyarı
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ğini 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 Okuma
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- Microsoft SQL Server 2005'te Sorgu Bildirimlerini Kullanma
- Sorgu Bildirimi Oluşturma
-
ASP.NET'te
SqlCacheDependencysınıfıyla önbelleğe alma -
ASP.NET SQL Server Kayıt Aracı (
aspnet_regsql.exe) -
Genel bakış
SqlCacheDependency
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 asıl değerlendiricileri Marko Rangel, Teresa Murphy ve Hilton Giesenow oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.