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
Herhangi bir Web uygulamasında bazı veriler sık kullanılır ve bazı veriler seyrek kullanılır. Önbelleğe Alma olarak bilinen bir teknik olan sık kullanılan verileri önceden yükleyerek ASP.NET uygulamamızın performansını iyileştirebiliriz. Bu öğreticide, uygulama başlangıcında önbelleğe veri yüklemek için proaktif yükleme yaklaşımı gösterilmektedir.
Giriş
Önceki iki öğreticide, Sunu ve Önbelleğe Alma Katmanları'ndaki verileri önbelleğe alma işlemi incelenmişti. ObjectDataSource ile Verileri Önbelleğe Alma bölümünde, verileri Sunum Katmanı'nda önbelleğe almak için ObjectDataSource'un önbelleğe alma özelliklerini kullanmaya baktık. Mimarideki Verileri Önbelleğe Alma Yeni, ayrı bir Önbelleğe Alma Katmanında önbelleğe alma işlemini inceledi. Bu öğreticilerin her ikisi de veri önbelleğiyle çalışırken reaktif yükleme kullandı. Reaktif yükleme ile, veri her istendiğinde, sistem önce önbellekte olup olmadığını kontrol eder. Aksi takdirde, veritabanı gibi kaynak kaynaktan verileri alır ve sonra önbellekte depolar. Reaktif yüklemenin temel avantajı, uygulama kolaylığıdır. Dezavantajlarından biri, istekler arasında eşit olmayan performansıdır. Ürün bilgilerini görüntülemek için önceki öğreticideki Önbelleğe Alma Katmanı'nı kullanan bir sayfa düşünün. Bu sayfa ilk kez ziyaret edildiğinde veya önbelleğe alınan veriler bellek kısıtlamaları nedeniyle çıkarıldıktan veya belirtilen süre sonu ulaşıldıktan sonra ilk kez ziyaret edildiğinde, verilerin veritabanından alınması gerekir. Bu nedenle, bu kullanıcı istekleri önbellek tarafından sunulan kullanıcı isteklerinden daha uzun sürer.
Proaktif yükleme , önbelleğe alınan verileri ihtiyaç duyulmadan önce yükleyerek istekler arasında performansı düzelten alternatif bir önbellek yönetimi stratejisi sağlar. Proaktif yükleme genellikle, temel alınan verilerde bir güncelleştirme olduğunda düzenli aralıklarla denetleyen veya bilgilendiren bazı işlemleri kullanır. Bu işlem daha sonra önbelleği güncel tutmak için güncelleştirir. Temel alınan veriler yavaş veritabanı bağlantısından, Web hizmetinden veya özellikle yavaş veri kaynaklarından geliyorsa proaktif yükleme özellikle yararlıdır. Ancak, değişiklikleri denetlemek ve önbelleği güncelleştirmek için bir işlem oluşturma, yönetme ve dağıtma gerektirdiğinden, proaktif yükleme yaklaşımının uygulanması daha zordur.
Proaktif yüklemenin bir diğer özelliği ve bu öğreticide keşfedeceğimiz tür, uygulama başlangıcında verileri önbelleğe yüklemektir. Bu yaklaşım özellikle veritabanı arama tablolarındaki kayıtlar gibi statik verileri önbelleğe almak için kullanışlıdır.
Uyarı
Proaktif yükleme ile reaktif yükleme arasındaki farkların yanı sıra artılar, dezavantajlar ve uygulama önerileri listelerine daha ayrıntılı bir bakış için .NET Framework Uygulamaları için Önbelleğe Alma Mimarisi Kılavuzu'nun Önbellekİçeriğini Yönetme bölümüne bakın.
1. Adım: Uygulama Başlangıcında Önbelleğe Alınacak Verileri Belirleme
Önceki iki öğreticide incelediğimiz reaktif yükleme kullanan önbelleğe alma örnekleri, düzenli aralıklarla değişebilen ve oluşturulması çok uzun sürmeyen verilerle iyi çalışır. Ancak önbelleğe alınan veriler hiçbir zaman değişmezse, reaktif yükleme tarafından kullanılan süre sonu gereksizdir. Benzer şekilde, önbelleğe alınan verilerin oluşturulması çok uzun sürüyorsa, istekleri önbelleği boş bulan kullanıcıların, temel alınan veriler alınırken uzun bir bekleme süresine katlanması gerekir. Uygulama başlangıcında oluşturulması son derece uzun süren statik verileri ve verileri önbelleğe almayı göz önünde bulundurun.
Veritabanlarında çok sayıda dinamik, sık değişen değer olsa da çoğu düzgün miktarda statik veriye sahiptir. Örneğin, neredeyse tüm veri modellerinde sabit bir seçenek kümesinden belirli bir değer içeren bir veya daha fazla sütun bulunur. Veritabanı Patients
tablosunda İngilizce, İspanyolca, Fransızca, Rusça, Japonca gibi değerler içeren bir PrimaryLanguage
sütun bulunabilir. Bu tür sütunlar genellikle arama tabloları kullanılarak uygulanır. İngilizce veya Fransızca Patients
dizesini tabloda depolamak yerine, genellikle iki sütunu (benzersiz tanımlayıcı ve dize açıklaması) ve her olası değer için bir kayıt içeren ikinci bir tablo oluşturulur. Tablodaki PrimaryLanguage
sütun, Patients
arama tablosunda karşılık gelen benzersiz tanımlayıcıyı depolar. Şekil 1'de, hasta John Doe'nun ana dili İngilizce, Ed Johnson'ın ana dili Rusça'dır.
Şekil 1: Tablo, Languages
Tablo Tarafından Patients
Kullanılan Bir Arama Tablosudur
Yeni bir hasta düzenlemek veya oluşturmak için kullanıcı arabirimi, tablodaki Languages
kayıtlar tarafından doldurulan izin verilebilen dillerin açılan listesini içerir. Önbelleğe alma olmadan, bu arabirim her ziyaret edilirken sistem tabloyu sorgulamalıdır Languages
. Arama tablosu değerleri çok seyrek, hatta hiç değişmediğinden bu savurgan ve gereksizdir.
Önceki öğreticilerde incelenen aynı reaktif yükleme tekniklerini kullanarak Languages
verilerini önbelleğe alabiliriz. Ancak reaktif yükleme, statik arama tablosu verileri için gerekli olmayan zamana bağlı bir süre sonu kullanır. Reaktif yükleme kullanarak önbelleğe almak hiç önbelleğe almamaktan daha iyi olsa da, en iyi yaklaşım uygulama başlangıcında arama tablosu verilerini önceden önbelleğe yüklemektir.
Bu öğreticide, arama tablosu verilerinin ve diğer statik bilgilerin nasıl önbelleğe alınacağını inceleyeceğiz.
2. Adım: Verileri Önbelleğe Almanın Farklı Yollarını inceleme
Bilgiler, çeşitli yaklaşımlar kullanılarak ASP.NET bir uygulamada program aracılığıyla önbelleğe alınabilir. Önceki öğreticilerde veri önbelleğinin nasıl kullanılacağını zaten görmüştük. Alternatif olarak, nesneler statik üyeler veya uygulama durumu kullanılarak program aracılığıyla önbelleğe alınabilir.
Bir sınıfla çalışırken, genellikle üyelerine erişilmeden önce sınıfın örneği oluşturulmalıdır. Örneğin, İş Mantığı Katmanımızdaki sınıflardan birinden bir yöntemi çağırmak için önce sınıfının bir örneğini oluşturmamız gerekir:
ProductsBLL productsAPI = new ProductsBLL();
productsAPI.SomeMethod();
productsAPI.SomeProperty = "Hello, World!";
SomeMethod'u çağırabilmek veya SomeProperty ile çalışabilmek için önce anahtar sözcüğünü kullanarak sınıfın bir örneğini new
oluşturmamız gerekir.
SomeMethod ve SomeProperty belirli bir örnekle ilişkilendirilir. Bu üyelerin ömrü, ilişkili nesnenin ömrüne bağlıdır.
Diğer taraftan statik üyeler, sınıfın tüm örnekleri arasında paylaşılan değişkenler, özellikler ve yöntemlerdir ve sonuç olarak, sınıfı kadar uzun bir ömrü vardır. Statik üyeler anahtar sözcüğüyle static
gösterilir.
Statik üyelere ek olarak, veriler uygulama durumu kullanılarak önbelleğe alınabilir. Her ASP.NET uygulaması, uygulamanın tüm kullanıcıları ve sayfaları arasında paylaşılan bir ad/değer koleksiyonu tutar. Bu koleksiyona sınıfınHttpContext
Application
özelliği kullanılarak erişilebilir ve aşağıdaki gibi bir ASP.NET sayfasının arka plan kod sınıfından kullanılabilir:
Application["key"] = value;
object value = Application["key"];
Veri önbelleği, verileri önbelleğe almak için çok daha zengin bir API sağlar ve zaman ve bağımlılık tabanlı süre sonu, önbellek öğesi öncelikleri vb. için mekanizmalar sağlar. Statik üyeler ve uygulama durumu ile bu özelliklerin sayfa geliştiricisi tarafından el ile eklenmesi gerekir. Bununla birlikte, uygulama başlangıcında verileri uygulamanın ömrü boyunca önbelleğe alırken, veri önbelleğinin avantajları tartışmalıdır. Bu öğreticide, statik verileri önbelleğe almak için üç tekniği de kullanan kodu inceleyeceğiz.
3. Adım: Tablo Verilerini Önbelleğe AlmaSuppliers
Bugüne kadar uyguladığımız Northwind veritabanı tablolarında geleneksel arama tabloları yok. DAL'mizde uygulanan dört DataTable değeri statik olmayan tüm model tablolarıdır. DAL'a yeni bir DataTable ve ardından BLL'ye yeni bir sınıf ve yöntemler eklemek için zaman harcamak yerine, bu öğretici için tablonun Suppliers
verilerinin statik olduğunu varsayalım. Bu nedenle, bu verileri uygulama başlangıcında önbelleğe alabilirdik.
Başlamak için StaticCache.cs
klasöründe CL
adlı yeni bir sınıf oluşturun.
Şekil 2: StaticCache.cs
Klasöründe CL
Sınıfı Oluşturma
Başlangıçtaki verileri uygun önbellek deposuna yükleyen bir yöntemin yanı sıra bu önbellekten veri döndüren yöntemleri eklememiz gerekir.
[System.ComponentModel.DataObject]
public class StaticCache
{
private static Northwind.SuppliersDataTable suppliers = null;
public static void LoadStaticCache()
{
// Get suppliers - cache using a static member variable
SuppliersBLL suppliersBLL = new SuppliersBLL();
suppliers = suppliersBLL.GetSuppliers();
}
[DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
public static Northwind.SuppliersDataTable GetSuppliers()
{
return suppliers;
}
}
Yukarıdaki kod, suppliers
yöntemden çağrılan sınıfın SuppliersBLL
yönteminden GetSuppliers()
elde edilen sonuçları tutmak için statik bir üye değişkeni LoadStaticCache()
() kullanır. Yöntemin LoadStaticCache()
, uygulamanın başlatılması sırasında çağrılması amaçlanmıştır. Bu veriler uygulama başlangıcında yüklendikten sonra, tedarikçi verileriyle çalışması gereken herhangi bir sayfa sınıfın StaticCache
GetSuppliers()
yöntemini çağırabilir. Bu nedenle, tedarikçileri almak için veritabanına yapılan çağrı, uygulama başlangıcında yalnızca bir kez gerçekleşir.
Önbellek deposu olarak statik üye değişkeni kullanmak yerine alternatif olarak uygulama durumunu veya veri önbelleğini kullanmış olabilirdik. Aşağıdaki kod, uygulama durumunu kullanmak için yeniden kullanılan sınıfı gösterir:
[System.ComponentModel.DataObject]
public class StaticCache
{
public static void LoadStaticCache()
{
// Get suppliers - cache using application state
SuppliersBLL suppliersBLL = new SuppliersBLL();
HttpContext.Current.Application["key"] = suppliersBLL.GetSuppliers();
}
[DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
public static Northwind.SuppliersDataTable GetSuppliers()
{
return HttpContext.Current.Application["key"] as Northwind.SuppliersDataTable;
}
}
içinde LoadStaticCache()
, sağlayıcı bilgileri uygulama değişken anahtarına depolanır. 'den Northwind.SuppliersDataTable
uygun tür (GetSuppliers()
) olarak döndürülür. ASP.NET sayfalarının arka plan kodu sınıfları kullanılarak uygulama durumuna erişilebilirken, geçerli Application["key"]
öğesini almak için mimari içinde HttpContext.Current.Application["key"]
kullanmamız gerekir.
Benzer şekilde, aşağıdaki kodda gösterildiği gibi veri önbelleği önbellek deposu olarak kullanılabilir:
[System.ComponentModel.DataObject]
public class StaticCache
{
public static void LoadStaticCache()
{
// Get suppliers - cache using the data cache
SuppliersBLL suppliersBLL = new SuppliersBLL();
HttpRuntime.Cache.Insert(
/* key */ "key",
/* value */ suppliers,
/* dependencies */ null,
/* absoluteExpiration */ Cache.NoAbsoluteExpiration,
/* slidingExpiration */ Cache.NoSlidingExpiration,
/* priority */ CacheItemPriority.NotRemovable,
/* onRemoveCallback */ null);
}
[DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
public static Northwind.SuppliersDataTable GetSuppliers()
{
return HttpRuntime.Cache["key"] as Northwind.SuppliersDataTable;
}
}
Zaman tabanlı süre sonu olmadan veri önbelleğine bir öğe eklemek için System.Web.Caching.Cache.NoAbsoluteExpiration
ve System.Web.Caching.Cache.NoSlidingExpiration
değerlerini giriş parametresi olarak kullanın. Veri önbelleği Insert
yönteminin bu özel aşırı yüklenmesi, önbellek öğesinin önceliğini belirleyebilmemiz için seçildi. Kullanılabilir bellek yetersiz olduğunda önbellekten hangi öğelerin atılabileceğini belirlemek için öncelik kullanılır. Burada, bu önbellek öğesinin temizlenmemesini sağlayan öncelik NotRemovable
kullanılır.
Uyarı
Bu öğreticinin indirilmesi, statik üye değişkeni yaklaşımını StaticCache
kullanarak sınıfı uygular. Uygulama durumu ve veri önbelleği tekniklerinin kodu, sınıf dosyasındaki açıklamalarda kullanılabilir.
4. Adım: Uygulama Başlangıcında Kod Yürütme
Bir web uygulaması ilk başlatıldığında kodu yürütmek için adlı Global.asax
özel bir dosya oluşturmamız gerekir. Bu dosya uygulama, oturum ve istek düzeyi olayları için olay işleyicileri içerebilir ve burada uygulama her başlatıldığında yürütülecek kodu ekleyebiliriz.
Global.asax
Visual Studio'nun Çözüm Gezgini'nde web sitesi proje adına sağ tıklayıp Yeni Öğe Ekle'yi seçerek dosyayı web uygulamanızın kök dizinine ekleyin. Yeni Öğe Ekle iletişim kutusunda Genel Uygulama Sınıfı öğe türünü seçin ve ekle düğmesine tıklayın.
Uyarı
Projenizde zaten bir Global.asax
dosya varsa, Genel Uygulama Sınıfı öğe türü Yeni Öğe Ekle iletişim kutusunda listelenmez.
Şekil 3: Dosyayı Web Uygulamanızın Kök Dizinine Global.asax
Ekleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Varsayılan Global.asax
dosya şablonu, sunucu tarafı <script>
etiketinde beş yöntem içerir:
-
Application_Start
web uygulaması ilk kez başlatıldığında yürütülür -
Application_End
uygulama kapatılırken çalışır -
Application_Error
işlenmeyen bir özel durum uygulamaya her ulaştığında yürütülür -
Session_Start
yeni bir oturum oluşturulduğunda yürütülür -
Session_End
oturumun süresi dolduğunda veya bırakıldığında çalışır
Olay Application_Start
işleyicisi, bir uygulamanın yaşam döngüsü boyunca yalnızca bir kez çağrılır. Uygulama, uygulamadan ilk kez bir ASP.NET kaynağı istendiği zaman başlatılır ve uygulama yeniden başlatılana kadar çalışmaya devam eder. Bu durum, diğer nedenlerin yanı sıra /Bin
klasörünün içeriğini değiştirerek, Global.asax
değiştirerek, App_Code
klasörünün içeriğini değiştirerek veya Web.config
dosyasını değiştirerek gerçekleşebilir. Uygulama yaşam döngüsü hakkında daha ayrıntılı bir tartışma için ASP.NET Uygulama Yaşam Döngüsüne Genel Bakış bölümüne bakın.
Bu öğreticiler için sadece Application_Start
yöntemine kod eklememiz gerekiyor; bu yüzden diğerlerini kaldırmaktan çekinmeyin. 'da Application_Start
, tedarikçi bilgilerini yükleyecek ve önbelleğe alacak olan sınıfın StaticCache
LoadStaticCache()
yöntemini çağırmanız yeterlidir:
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
StaticCache.LoadStaticCache();
}
</script>
Hepsi bu kadar! Uygulama başlangıcında, LoadStaticCache()
yöntemi BLL'den sağlayıcı bilgilerini alacak ve bunları statik üye değişkeninde (veya StaticCache
sınıfında kullandığınız önbellek deposunda) depolayacaktır. Bu davranışı doğrulamak için yönteminde Application_Start
bir kesme noktası ayarlayın ve uygulamanızı çalıştırın. Kesme noktasına uygulama başlatılırken isabet ettiğini unutmayın. Ancak sonraki istekler Application_Start
yönteminin çalışmasına neden olmaz.
Şekil 4: Olay İşleyicisinin Application_Start
Yürütülmekte Olduğunu Doğrulamak için Kesme Noktası Kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Hata ayıklamaya Application_Start
ilk başladığınızda kesme noktasına ulaşmazsanız, bunun nedeni uygulamanızın zaten başlamış olmasıdır.
Global.asax
veya Web.config
dosyalarınızı değiştirerek uygulamayı yeniden başlatmaya zorlayın ve sonra yeniden deneyin. Uygulamayı hızlı bir şekilde yeniden başlatmak için bu dosyalardan birinin sonuna boş bir satır eklemeniz (veya kaldırmanız) yeterlidir.
5. Adım: Önbelleğe Alınan Verileri Görüntüleme
Bu noktada StaticCache
sınıfı, uygulama başlangıcında önbelleğe alınan sağlayıcı verilerinin bir sürümünü tutar ve bu verilere GetSuppliers()
yöntemiyle erişilebilir. Sunum Katmanı'ndaki bu verilerle çalışmak için bir ObjectDataSource kullanabilir veya bir ASP.NET sayfasının arka plan kod sınıfından sınıfın StaticCache
GetSuppliers()
yöntemini program aracılığıyla çağırabiliriz. Önbelleğe alınmış tedarikçi bilgilerini görüntülemek için ObjectDataSource ve GridView denetimlerini kullanmaya göz atalım.
Öncelikle AtApplicationStartup.aspx
klasöründeki Caching
sayfasını açarak başlayın. Bir GridView'ı Araç Kutusu'ndan tasarımcıya sürükleyin ve özelliğini ID
olarak Suppliers
ayarlayın. Ardından, GridView'ın akıllı etiketinden adlı yeni bir ObjectDataSource SuppliersCachedDataSource
oluşturmayı seçin. ObjectDataSource'u StaticCache
sınıfın GetSuppliers()
yöntemini kullanacak şekilde yapılandırın.
Şekil 5: ObjectDataSource'u bir sınıfı kullanacak şekilde yapılandırmak StaticCache
(Tam boyutlu görüntüyü görmek için tıklayın)
Şekil 6: Önbelleğe Alınan Sağlayıcı Verilerini Almak için Yöntemini Kullanma GetSuppliers()
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sihirbazı tamamladıktan sonra, Visual Studio içindeki her veri alanı SuppliersDataTable
için otomatik olarak BoundField ekler. GridView ve ObjectDataSource'un bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersCachedDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
InsertVisible="False" ReadOnly="True"
SortExpression="SupplierID" />
<asp:BoundField DataField="CompanyName" HeaderText="CompanyName"
SortExpression="CompanyName" />
<asp:BoundField DataField="Address" HeaderText="Address"
SortExpression="Address" />
<asp:BoundField DataField="City" HeaderText="City"
SortExpression="City" />
<asp:BoundField DataField="Country" HeaderText="Country"
SortExpression="Country" />
<asp:BoundField DataField="Phone" HeaderText="Phone"
SortExpression="Phone" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersCachedDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetSuppliers" TypeName="StaticCache" />
Şekil 7'de tarayıcı üzerinden görüntülendiğinde sayfa gösterilmektedir. Çıktı, verileri BLL'nin SuppliersBLL
sınıfından çektiğimizde aynıdır, ancak sınıfı kullanmak StaticCache
, sağlayıcı verilerini uygulama başlangıcında önbelleğe alınmış olarak döndürür. Bu davranışı StaticCache
doğrulamak için sınıfın GetSuppliers()
yönteminde kesme noktaları ayarlayabilirsiniz.
Şekil 7: Önbelleğe Alınan Sağlayıcı Verileri GridView'da Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Özet
Çoğu veri modeli, genellikle arama tabloları biçiminde uygulanan makul miktarda statik veri içerir. Bu bilgiler statik olduğundan, bu bilgilerin her görüntülenmesi gerektiğinde veritabanına sürekli olarak erişmek için bir neden yoktur. Ayrıca, statik yapısı nedeniyle, verileri önbelleğe alırken son kullanma tarihine gerek yoktur. Bu öğreticide, bu tür verilerin nasıl alınıp veri önbelleğinde, uygulama durumunda ve statik bir üye değişkeni aracılığıyla önbelleğe alındığını gördük. Bu bilgiler uygulama başlatıldığında önbelleğe alınır ve uygulamanın kullanım ömrü boyunca önbellekte kalır.
Bu öğreticide ve son iki öğreticide, uygulamanın kullanım ömrü boyunca verileri önbelleğe almanın yanı sıra zamana dayalı süre sonlarını kullanmaya baktık. Ancak veritabanı verilerini önbelleğe alırken zamana bağlı süre sonu idealden az olabilir. Önbelleği düzenli aralıklarla temizlemek yerine, yalnızca temel alınan veritabanı verileri değiştirildiğinde önbelleğe alınan öğeyi çıkarmak en uygun olacaktır. Bu ideal, sonraki öğreticimizde inceleyeceğimiz SQL önbellek bağımlılıklarının kullanılmasıyla mümkündür.
Mutlu Programlama!
Yazar Hakkında
Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş değerlendiricileri Teresa Murphy ve Zack Jones oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.