2011-12-13 17 views
6

Ho una query sql (stored proc) che richiede circa 8-10 secondi prima che i risultati vengano visualizzati in una webgrid. Qual è la migliore pratica per le prestazioni riguardanti il ​​caricamento in cache in asp.net-mvc3 in modo che l'utente non debba prendere quel colpo 8-10 sec ogni volta per caricare i dati (meno ottimizzando la query)?Tecniche di memorizzazione dati nella cache MVC3

risposta

11

È possibile utilizzare la classe MemoryCache per archiviare il risultato di questa query sotto una certa chiave. La chiave potrebbe essere l'hash dei criteri di query (se si dispone di tale). E qui ci sono some guides su MSDN su come usarlo.

Quando si implementa la memorizzazione nella cache, tenere presente che questa cache è memorizzata in memoria per impostazione predefinita. Ciò significa che se si esegue questa applicazione in una Web farm potrebbe essere più interessante utilizzare una cache distribuita in modo che tutti i nodi della farm condividano gli stessi dati memorizzati nella cache. Questo potrebbe essere fatto estendendo la classe ObjectCache con alcune soluzioni di caching distribuito. Ad esempio memcached è popolare e ha .NET provider. Un'altra soluzione di caching distribuita è AppFabric.

+0

MemoryCache è probabilmente la soluzione giusta, ma ho alcuni scenari in cui gli oggetti vengono automaticamente sfrattati dalla cache (con un MVC 3). Qual è il tuo consiglio in merito? Sono necessarie configurazioni particolari per farlo funzionare con MVC? Oh bene, se vuoi fare un tentativo, puoi leggere http://stackoverflow.com/questions/7849000/memorycache-empty-just-after-adding-an-object? Sto ancora combattendo con questo problema e non riesco a capire dove sto fallendo. :(Grazie – BigMike

+0

@BigMike, è possibile specificare una politica di scadenza quando si memorizzano oggetti nella cache.È possibile definire la scadenza assoluta, la scadenza scorrevole, cambiare i monitor, ... È molto flessibile –

+0

sì, posso, ho provato con espirazione scorrevole e scadenza del tempo assoluto, in alcuni scenari ho sfrattato tutto per apparentemente senza motivo, la cosa divertente è che nella mia chiamata rimossa ho una Reason of CacheSpecificEviction ma non riesco a trovare chi sta effettivamente sfrattando – BigMike

3

Sta memorizzando nella cache questa azione.

[OutputCache(Duration = 300)] 
public ActionResult Action(){ 

//some operation 

return View() 
} 
+0

Questo memorizzerà l'intera azione (ad esempio l'azione non verrà nemmeno eseguita), quindi anche se i dati cambiano, non verranno eseguiti per i successivi 5 minuti. A volte può aiutare, ma quando accedo ai dati preferisco non usarlo – BigMike

2

Quanto spesso cambiano i dati di copertura di questa stored procedure? Se relativamente di rado, è possibile utilizzare caratteristica molto buona - SqlCacheDependency

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

questo modo il vostro SP pesante verrà chiamato solo quando necessario, e il risultato verrà memorizzata nella cache più a lungo possibile.

+0

Thx per la risposta, che probabilmente dovrà essere aggiornato ogni 3-4 ore, tuttavia ho ricevuto SqlCachDep endecy funziona così grazie ma probabilmente dovrò aggiornarlo più frequentemente. – JaJ

Problemi correlati