SQL-Caching und Entity Framework
Ich haben zusammen eine kleine ASP.NET MVC 2-Website, hat einige sehr umfangreiche date-mining - /table-joins/etc.
Mithilfe von MVC, ich habe einen controller, der die Daten zurück, die in vielen verschiedenen Formen (Tabellen, Bilder, etc). Zu retten, schlagen Sie die Datenbank regelmäßig ich habe ein dual-cache-Mechanismus:
- Für identische Parameter, um die gleiche Aktion, die ich verwenden
OutputCacheAttribute
mitVaryByParam = "*"
. - Vorausgesetzt, einige parameter der Aktion geändert hat (oder eine andere Aktion aufgerufen wird), ist es immer noch möglich, dass meine "Daten" hat, die zuvor angefordert wurden, also Speicher ich die Daten in einer view-Modell nach dem ersten Treffer in der Datenbank, die ich erreichen dies mit einem .NET 4.0
System.Runtime.Caching.ObjectCache
.
Beispiel der ObjectCache
im inneren des Controllers:
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.
Das gibt mir eine gute performance-Verbesserung, aber wo es ausfällt, ist auf die CacheItemPolicy
sehr einfach. Im Idealfall würde ich gerne das cache-Fenster größer zu werden, aber haben das zwischengespeicherte Element erlischt, wenn änderungen in der Datenbank.
Den CacheItemPolicy
scheint dieser mit der ChangeMonitors
- Kollektion, die ich hinzufügen könnte, ein SqlChangeMonitor
, aber wenn man versucht zu konstruieren, das ist, wo ich zum Stillstand kommen.
Bin ich mit Entity Framework 4, um den Zugriff auf eine SQL-Datenbank, wie wie gestalte ich die SqlChangeMonitor
überwachen die paar Datenbank-Tabellen, die wahrscheinlich sind zu auslösen eines cache laufen?
SqlChangeMonitor
ist konstruiert, mit einer SqlDependency
nimmt eine SqlCommand
- wie kann ich die Riegel auf Entity Framework ist die Kapselung von meiner Datenbank?
- Ziemlich gute Frage. Ich glaube nicht, dass es möglich, aber lassen Sie uns warten und sehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich, wickeln Sie jede beliebige LINQ-Abfrage in eine SqlDependency, darunter EF, Linq-Abfragen, siehe LinqToCache. Aber leider, wie EF wählt die Formulierung der SQL für die Abfragen, sogar die am meisten einfache
from t in context.table select t
ist unvereinbar mit der Abfrage Notificaiton Beschränkung und die SqlDependency ungültig ist sofort als eine ungültige Anweisung. Ich habe gesprochen, über dieses in SqlDependency-basierte caching von LINQ-Abfragen.Was man tun kann, ist
SqlChangeMonitor
einfacheSqlCommand
Objekte konstruiert als einfacheSELECT ... FROM Table
auf Ihre Tabellen, die sich wahrscheinlich ändern wird. Sie müssen verstehen, dass es ein Gleichgewicht zwischen den Kosten für die Einrichtung von Benachrichtigungen und die Kosten von polling, wenn Ihre Tabellen Häufig ändern dann die überwachung für änderungen könnten wiederum teurer sein als polling. Finden Sie in diesem Artikel Die Mysteriöse Meldung zu verstehen, wie QN funktioniert und was ist die Kosten der überwachung.hi Antwort, mit der Umsetzung können gefunden werden auf der folgenden Website
http://harismile.wordpress.com/2010/09/09/mvc-with-ef-sqldependencycache/