数据库

Dot Net Web Uygulamalarında Göreceli Olarak Statik Verileri Önbelleğe Getirerek Performansı Artırma

Ancak, web uygulamalarının en önemlisi, verilerini veritabanı tabloları içinde saklar. Bu veriler genel olarak iki geniş kategoriye ayrılabilir:

1) Transaksiyonel veriler

2) Kontrol verileri

Daha da göstermek için, 100.000 forum gönderisini içeren bir tartışma forumu örneğini ele alalım. [19659002] Transaksiyonel Veriler

Her mesaj kendi içinde büyük olasılıkla forum gönderileri için ayrı bir tabloda saklanır. Burada yapılabilecek çok şey yok. Bir gönderi ne zaman baktığımıza bakılmaksızın, her seferinde bu veri kaydının veritabanından alınması gerekir.

Kontrol verileri.

Şimdi forumların listesi, web sitesi gibi veri yapılarını dikkate alınız. menü yapısı vb … Bu veri kayıtlarının görüntülenen her sayfa için alınması gerekir. Ancak, bu verilerin nispeten az sayıda kayıt olduğu ve neredeyse hiç değişmediği gerçeğini göz önünde bulundurun.

Veritabanından veri istendiğinde ne olur

Her bir veri ne kadar küçük olursa olsun, 15 ila 20 milisaniyelik bir gecikme yaşanmaz. Bunun nedeni, veri isteğinin, veri mevcut olmadan önce veri erişim yığınında birçok alt katmandan işlenmesi gerektiğinden kaynaklanmaktadır. Bu katmanların basitleştirilmiş bir görünümü aşağıdaki gibi olacaktır:

1) Nokta net framework system.data ad alanı içindeki nesneler tarafından işleniyor (örneğin, veri kümesi, bağlantı)

2) Talebin alt düzey veritabanı sürücüsüne geçirilmesi

3) İsteği tcp akışları veya adlandırılmış yöneltmeler aracılığıyla veritabanı sunucusunun kendisine serileştirme

4) sql sözdiziminin işlenmesi ve veri tabanı sunucusu tarafından verilerin alınması

5) Yanıtı düşük seviyeli veritabanı sürücüsü tarafından tcp akışları veya adlandırılmış yöneltmelerle seri hale getirme

6) Nokta net framework system.data ad alanının yanıtını döndürüyor.

Gördüğünüz gibi, veritabanından bir kaydı getirme, önemsiz bir görev gibi görünse de, arka planda önemli bir işlem devam ediyor. [19659002] Veri tabanı taleplerinden kaynaklanan performans artışı

IIS (ve herhangi bir başka web sunucusu), web uygulamalarının çok iş parçacıklı yürütmesini sağlasa da, bu, birden fazla web isteğini paralel olarak işlemek içindir. Bir web tarayıcısından tek bir web isteği, tek bir web sunucusu iş parçacığı tarafından işlenecektir. Bu bağlamda, belirli bir web sayfası için bir web uygulaması 25 veri tabanı talebi, veriyi beklemek üzere 375 ila 500 milisaniyede bir yükü etkin bir şekilde garanti eder. Bu noktayı daha da vurgulamak için, uygulama kodunun çoğu web uygulama sayfası için kendisinin 50 milisaniyeden daha az bir sürede tamamlandığını düşünün.

Küçük bir sitede bu durum herhangi bir sorun teşkil etmese de büyük siteler için oldukça hızlı bir şekilde ekleniyor. Herhangi bir web uygulama sayfasının yaşam döngüsüne dikkatle bakarsak, genel olarak veri talebinin% 40 ila% 70'inin kontrol verileri için olduğunu görürüz. Önbelleğe alınabilecek olan verileri kontrol edin. Genel olarak, önbelleğe alınan verileri almak, daha az ölçülebilir, hatta ölçülebilir değildir. Kontrol verilerinin önbelleğe alınması, genel olarak ortalama bir uygulama sayfasının 400 milisaniyeden farklı olarak 150 milisaniyeden daha az bir sürede işleyebileceği anlamına gelir. Gördüğünüz gibi performans artışı çok büyüktür.

Önbellek denetimi verileri

Doğal olarak Dot Net web uygulamalarında bunu başarmanın birçok yolu vardır.

1) Uygulama Alanlarını önbelleğe alma

2) Microsoft Enterprise Library'deki gibi özel nesne önbellekleriyle önbelleğe alma

3) Statik yöntemlerle önbellekleme (Örnek uygulama sağlanır)

Uygulama Etki Alanı Önbelleği:

IIS, oldukça yüksek performanslı bir önbellek mekanizması sağlar. System.Web.Caching örneklerine ve bu belgenin nasıl uygulanacağına dair belgelere bakın.

Özel önbelleğe alma kütüphaneleriyle önbelleğe alma

Bunların pek çok çeşidi belki de en kolay olanlardan biridir. uygulamaya

Daha fazla detaylar aşağıdaki iki linkte bulunabilir

http://www.codeplex.com/entlib

http://msdn.microsoft.com/en-us/library/cc309502.aspx

Statik yöntemlerle önbelleğe alma

Bir nokta net web uygulaması içinde tanımlanan statik yöntem tüm uygulama için küresel. Buradaki tek istisna, bir web grubu veya IIS işlem çiftliğinin kullanılmasıdır. Bu örnekte statik yöntem, tek bir IIS işleminde (uygulama havuzu işlemi) yürüten tüm iş parçacıkları için geneldir.

Tüm uygulama havuzu işlemindeki tüm iş parçacıkları bu statik yöntemlere erişimi paylaşacağından, burada gösterilen iş parçacığı kilitleme kilitleri zorunludur.

Aşağıdaki kod parçacığı, bu stratejiyi her 5 dakikada bir yeniden yükleme ile nasıl uygulayacağınıza ilişkin bir örnek sağlar.

public class ForumName

{

// Üst düzey bir forumun temsil edilmesi için örnek veri nesne sınıfı [19659011] public ForumName (string ValName, string ValSummary)

{

m_Name = ValName;

m_Summary = ValSummary;

// Veritabanı alanlarınızın geri kalanı için değerler atayın

} [19659011özeldizem_Name;

genel dize Ad {get {return m_Name; }}

özel dize m_Summary;

genel dize Özet {get {return m_Summary; }}

// Veritabanı alanlarınızın geri kalanı için özellikler

}

#region "property MyCachedMenu"

özel statik Liste m_MyCachedMenu;

özel statik bool m_MyCachedMenu_IsSet = false;

özel statik DateTime m_MyCachedMenu_LastLoaded = DateTime.MinValue;

özel statik nesne m_MyCachedMenu_SyncRoot = yeni nesne ();

genel statik System.Collections.ObjectModel.ReadOnlyCollection MyCachedMenu

{

olsun

{

DateTime LastLoadTime;

if (! M_MyCachedMenu_IsSet)

{

m_MyCachedMenu = yeni Liste ();

System.Threading.Monitor.Enter (m_MyCachedMenu_SyncRoot);

deneyin

{

if (! m_MyCachedMenu_IsSet)

{

LoadMenuFromDatabase ();

}

}

sonunda

{

System.Threading.Monitor.Exit (m_MyCachedMenu_SyncRoot);

}

m_MyCachedMenu_IsSet = true;

}

başka

{

System.T hreading.Monitor.Enter (m_MyCachedMenu_SyncRoot);

deneyin

{

LastLoadTime = m_MyCachedMenu_LastLoaded;

}

nihayet

{

System.Threading.Monitor.Exit (m_MyCachedMenu_SyncRoot);

}

if (((TimeSpan) DateTime.Now.Subtract (LastLoadTime)). TotalMinutes> 5) // Bu her 5 dakikada bir yeniden yükleme anlamına gelir

{

System.Threading.Monitor.Enter ( m_MyCachedMenu_SyncRoot);

deneyin

{

LoadMenuFromDatabase ();

}

son ​​olarak

{

System.Threading.Monitor.Exit (m_MyCachedMenu_SyncRoot);

} [19659011]}

}

m_MyCachedMenu.AsReadOnly ();

}

}

özel statik boşluk LoadMenuFromDatabase ()

{

m_MyCachedMenu_LastLoaded = DateTime.Now;

m_MyCachedMenu .Clear ();

// Veritabanından veri talep et burada

// Veri kayıtlarının her biri için yeni bir veri nesnesi oluşturun ve m_MyCachedMenu'ya

} [1965] 9011] #endregion

Uygulamanızla bol şanslar ve mümkün olan her yerde, sadece okunan verilerinizi önbelleğe aldığınızda web uygulamalarıyla hatırlıyorum.