2010-08-25 19 views
8

Çok kapsamlı bir tarih araştırması/tablo birleştirmeleri/vb. Yapan küçük bir ASP.NET MVC 2 sitesini bir araya getirdim.SQL Önbelleğe Alma ve Varlık Çerçevesi

MVC'yi kullanarak, verileri birçok farklı biçimde (tablolar, resimler, vb.) Veren bir denetleyicim var. Ben OutputCacheAttributeVaryByParam = "*" ile kullandığınız eylem özdeş parametreler için

  1. : veritabanını isabet kaydetmek için sıkça bir ikili önbellek mekanizmaya sahip.
  2. Eylemle ilgili bazı parametrelerin değiştiğini varsayarak (veya başka bir eylem denir), "verilerim" daha önce istenmiş olabilir, bu nedenle verileri veritabanının ilk isabından sonra bir görünüm modelinde saklıyorum. Bunu bir .NET 4.0 System.Runtime.Caching.ObjectCache ile başardım. Kontrolörün ObjectCache içinin

Örnek:

private static readonly ObjectCache cache = 
     new MemoryCache("CompareControllerCache"); 
private static void CacheObject(ViewModel obj, 
           string param1, 
           int someOtherParam) 
{ 
    string key = string.Format("{0}-{1}", param1, someOtherParam); 
    Trace.WriteLine(string.Format("Adding {0} to the cache", key)); 
    cache.Add(key, obj, new CacheItemPolicy 
     { 
      SlidingExpiration = TimeSpan.FromMinutes(1) 
     }); 
} 

// Corresponding GetCachedObject with similar key defining logic. 

Bu bana iyi bir performans artışı sağlar, ancak nerede başarısız çok basit olmasına CacheItemPolicy üzerindedir. İdeal olarak, önbellek penceresinin daha büyük olmasını isterim ancak veritabanı değiştiğinde önbelleğe alınan öğenin süresinin dolmasını istiyorum.

CacheItemPolicy, SqlChangeMonitor ekleyebildiğim ChangeMonitors koleksiyonuyla bunu destekliyor gibi görünüyor, ancak bunu oluşturmaya çalışırken bu noktaya geliyorum.

Bir SQL veritabanına erişmek için Entity Framework 4 kullanıyorum, SqlChangeMonitor nasıl bir önbelleği tetikleme olasılığı olan veritabanı veritabanlarının çiftini izlemek için nasıl yapıyorum? nasıl benim veritabanı Varlık Framework'ün kapsülleme üzerine mandalı -

SqlChangeMonitor bir SqlCommand götüren bir SqlDependency ile inşa edilmiştir?

+0

Oldukça iyi bir soru bulunabilir. Bunun mümkün olduğunu düşünmüyorum ama bekleyip görelim. – jfar

cevap

7

Herhangi bir isteğe bağlı LINQ sorgusunu EF Linq sorguları da dahil olmak üzere SqlDependency içinde sarmak mümkündür, bkz. LinqToCache. Ancak ne yazık ki, EF sorgular için en basit from t in context.table select t, hatta Sorgu için SQL formüle etmeyi seçtiğinde, Sorgu Bildirimi kısıtlaması ile uyumsuzdur ve SqlDependency geçersiz bir ifade olarak hemen geçersiz sayılır. Bu konuda konuştum SqlDependency based caching of LINQ Queries.

SqlChangeMonitor yapabilecekleriniz, tablolarınızda kolayca değişebilen SELECT ... FROM Table biçimindeki SqlCommand nesnelerini kolayca değiştirebilecek şekilde kullanın. Tabloların sık sık değişmesi durumunda, değişikliklerin izlenmesi, yoklamadan daha pahalıya dönüşebilirse, bildirimlerin kurulum maliyeti ile yoklamanın maliyeti arasında bir denge olduğunu anlamanız gerekir. QN'nin nasıl çalıştığını ve izleme maliyetinin ne olduğunu anlamak için bu makaleye bakın: The Mysterious Notification. uygulanmasıyla

+0

Bu özel durumda, veriler çok seyrek olarak değişir (haftada 10-20 kayıt güncellenir), ancak bu bir öğrenme projesidir ve daha ağır bir çevrede nasıl “doğru şeyi yapmalı” gerektiğini anlamak isterim. senin bağlantıların. Teşekkürler. –

+0

'Veri geri alma' önbelleği anahtardır, sahip olduğum binlerce kaydı işlemek için ~ 3 saniye sürüyor - bir süre optimizasyonu harcayabilmem de, yine de hızlı olmayacak - ancak yavaş değişim oranından dolayı, verilerin önbelleğe alınması nadiren sona erecek! –