SQL Önbellek Bağımlılıklarını Kullanma (C#)
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 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
, notificationCreated
ve 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_SqlCacheTablesForChangeNotification
tablonun 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.exe
aracı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 authors
ScottsServer
ve 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 , Categories
ve Suppliers
tablolarına Products
ekleyin. 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.
Ş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.MDF
App_Data
klasöründeki veritabanı klasörünü seçin.
Şekil 2: Klasördeki NORTHWND.MDF
App_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.
Ş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 , Categories
ve Suppliers
tablolarındaki Products
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 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_SqlCacheTablesForChangeNotification
her 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 ID
ProductsDeclarative
olarak ayarlayın ve akıllı etiketinden adlı yeni bir ObjectDataSource'a ProductsDataSourceDeclarative
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)
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
, unitPrice
ve productID
. INSERT ve DELETE sekmelerinde açılan listeleri (Hiçbiri) olarak ayarlayın.
Ş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)
Ş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. , , CategoryName
ve dışında ProductName
tüm alanları kaldırın ve UnitPrice
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 ö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 false
ayarlayı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.
Ş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ığınatrue
CacheDuration
, 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 Categories
aracılığıyla JOIN
alınır). Bu nedenle, iki SQL önbelleği bağımlılığı belirtmek istiyoruz: NorthwindDB:Products; NorthwindDB:Kategoriler .
Şekil 9: ve üzerinde Products
Categories
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.
Ş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'ı ID
ProductsProgrammatic
olarak ayarlayın ve akıllı etiketi aracılığıyla adlı yeni bir ObjectDataSource'a ProductsDataSourceProgrammatic
bağ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 UpdateProduct
olarak GetProducts
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: 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, , CategoryName
ve dışında ProductName
tüm alanları kaldırın ve UnitPrice
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. 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.aspx
ettiğ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.aspx
aracılığıyla ürünlerden birini düzenlerken daha olasıdır. Mimaride Verileri Önbelleğe Alma öğreticisinde, sınıfın MasterCacheKeyArray
UpdateProduct
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ı Products
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
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 ProductsCL
AddCacheItem
güncelleştirilmiş kod aşağıda gösterilmiştir. yöntemi, , Categories
ve Suppliers
tablolarının MasterCacheKeyArray
nesneleriyle SqlCacheDependency
Products
birlikte önbellek bağımlılığını oluşturur. Bunların tümü adlı aggregateDependencies
tek 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 , Categories
veya 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:
- Microsoft SQL Server 2005'te Sorgu Bildirimlerini Kullanma
- Sorgu Bildirimi Oluşturma
- sınıfıyla
SqlCacheDependency
ASP.NET ö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ış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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin