Ich habe eine kleine ASP.NET MVC 2-Site zusammengestellt, die einige sehr umfangreiche date mining/table-joins/etc.SQL Caching und Entity Framework
Mit MVC habe ich einen Controller, der die Daten in vielen verschiedenen Formen (Tabellen, Bilder usw.) zurückgibt. So speichern Sie die Datenbank schlagen häufig habe ich einen Dual-Cache-Mechanismus:
- Für identische Parameter auf die gleiche Aktion ich die
OutputCacheAttribute
mitVaryByParam = "*"
verwenden. - Angenommen, einige Parameter der Aktion haben sich geändert (oder eine andere Aktion wird aufgerufen), ist es möglich, dass meine "Daten" zuvor angefordert wurden, also speichere ich die Daten in einem Ansichtsmodell nach dem ersten Treffer der Datenbank, Ich erreiche dies mit einem .NET 4.0
System.Runtime.Caching.ObjectCache
.
Beispiel der ObjectCache
innerhalb 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 ihm eine gute Performance-Verbesserung, aber wo es nicht auf den CacheItemPolicy
sehr einfach ist. Im Idealfall möchte ich, dass das Cache-Fenster größer ist, aber das zwischengespeicherte Element abläuft, wenn sich die Datenbank ändert.
Die CacheItemPolicy
scheint dies mit der ChangeMonitors
Sammlung zu unterstützen, auf die ich ein SqlChangeMonitor
hinzufügen könnte, aber wenn dies zu konstruieren versucht, wo ich zum Stillstand kommen.
Ich benutze Entity Framework 4 für den Zugriff auf eine SQL-Datenbank, wie Wie baue ich die SqlChangeMonitor
, um die paar Datenbanktabellen zu überwachen, die wahrscheinlich einen Cache-Ablauf auslösen?
SqlChangeMonitor
ist mit einem SqlDependency
konstruiert, die SqlCommand
ein nimmt - wie kann ich auf Entity Framework Verkapselung von meiner Datenbank einklinken?
Ziemlich gute Frage gefunden werden. Ich denke nicht, dass es möglich ist, aber lass uns abwarten. – jfar