SQL Caching und Entity Framework

8

Ich habe eine kleine ASP.NET MVC 2-Site zusammengestellt, die einige sehr umfangreiche date mining / table-joins / etc ausführt.

Mit MVC habe ich einen Controller, der die Daten in vielen verschiedenen Formen (Tabellen, Bilder usw.) zurückgibt. Um das häufige Treffen der Datenbank zu sichern, habe ich einen doppelten Cache-Mechanismus:

  1. Für identische Parameter der gleichen Aktion verwende ich OutputCacheAttribute mit VaryByParam = "*" .
  2. Unter der Annahme, dass sich ein Parameter der Aktion geändert hat (oder eine andere Aktion aufgerufen wird), 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 für die ObjectCache innerhalb des Controllers:

%Vor%

Das gibt mir eine gute Leistungsverbesserung, aber wo es scheitert, ist die CacheItemPolicy sehr einfach. 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, zu der ich eine SqlChangeMonitor hinzufügen könnte, aber wenn ich versuche, dies zu konstruieren, stehe ich still.

Ich verwende Entity Framework 4 für den Zugriff auf eine SQL-Datenbank, wie Wie konstruiere ich SqlChangeMonitor , um die paar Datenbanktabellen zu überwachen, die wahrscheinlich einen Cache-Ablauf auslösen?

SqlChangeMonitor wird mit einem SqlDependency erstellt, das ein SqlCommand benötigt - wie kann ich die Encapsulation von Entity Framework meiner Datenbank speichern?

    
Ray Hayes 25.08.2010, 16:32
quelle

2 Antworten

7

Es ist möglich, eine beliebige LINQ-Abfrage in eine SqlDependency einzubetten, einschließlich EF Linq-Abfragen, siehe LinqToCache . Aber unglücklicherweise ist die Art und Weise, wie EF das SQL für die Abfragen formuliert, selbst das einfachste from t in context.table select t , nicht mit der Einschränkung der Abfragebenachrichtigung kompatibel und die SqlDependency wird sofort als ungültige Anweisung ungültig gemacht. Ich habe darüber im SqlDependency-basierten Caching von LINQ-Abfragen gesprochen.

Sie können SqlChangeMonitor mit einfachen SqlCommand -Objekten verwenden, die in Ihren Tabellen, die sich wahrscheinlich ändern, als einfache SELECT ... FROM Table konstruiert sind. Sie müssen wissen, dass zwischen den Kosten für die Einrichtung von Benachrichtigungen und den Kosten für die Abfrage ein Gleichgewicht besteht. Wenn sich Ihre Tabellen häufig ändern, kann die Überwachung auf Änderungen teurer sein als die Abfrage. Sehen Sie diesen Artikel The Mysterious Notification , um zu verstehen, wie QN funktioniert und welche Kosten für die Überwachung anfallen.

    
Remus Rusanu 25.08.2010, 16:58
quelle
2

Hallo Antwort mit der Implementierung finden Sie unter der Website

Zypern

    
hari 22.10.2010 08:18
quelle