Ho messo insieme un piccolo sito ASP.NET MVC 2 che esegue alcune estese data mining/tabelle-join/ecc.SQL Caching ed Entity Framework
Utilizzando MVC, ho un controller che restituisce i dati in molte forme diverse (tabelle, immagini, ecc.). Per salvare colpire il database spesso ho un duplice meccanismo di cache:
- Per i parametri identici alla stessa azione io uso la
OutputCacheAttribute
conVaryByParam = "*"
. - Supponendo che alcuni parametri dell'azione siano cambiati (o venga chiamata un'altra azione), è ancora possibile che i miei "dati" siano stati precedentemente richiesti, quindi memorizzo i dati in un modello di vista dopo il primo hit del database, Lo raggiungo con .NET 4.0
System.Runtime.Caching.ObjectCache
.
Esempio di ObjectCache
interno del regolatore:
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.
Questo mi dà un buon miglioramento delle prestazioni, ma dove non riesce è sul CacheItemPolicy
essere molto semplice. Idealmente, mi piacerebbe che la finestra della cache fosse più grande, ma l'elemento memorizzato nella cache scade se il database cambia.
La CacheItemPolicy
sembra sostenere questo con la collezione ChangeMonitors
, alla quale ho potuto aggiungere un SqlChangeMonitor
, ma quando si cerca di costruire questo è dove io vengo a una battuta d'arresto.
Sto utilizzando Entity Framework 4 per accedere a un database SQL, come come si costruisce lo SqlChangeMonitor
per monitorare le coppie di tabelle del database che possono attivare una scadenza della cache?
SqlChangeMonitor
è costruito con un SqlDependency
che prende un SqlCommand
- come posso fermo su di incapsulamento di Entity Framework del mio database?
Abbastanza buona domanda. Non penso sia possibile ma lascia aspettare e vedere. – jfar