Woher weiß eine SqlCacheDependency, wann sie mit den Listenern kommunizieren muss, wenn sich Daten in einer Tabelle ändern?

StackOverflow https://stackoverflow.com/questions/7353558

Frage

Ich habe einige Nachforschungen angestellt und kann die meisten Installationen für dieses System erkennen. Ich bin mir jedoch nicht sicher, woher SQL Server weiß, wann er eine Nachricht an irgendwelche Listener (Anwendungen) zurücksenden muss, wenn sich beispielsweise Daten in einer Tabelle ändern.Ich beginne damit, zu erklären, was ich bis zu dem Punkt verstehe, an dem ich den Überblick verliere.

1) Service Broker muss in der Datenbank aktiviert sein und einige Berechtigungen müssen festgelegt werden.

2) Das Datenbankschema sollte bereitgestellt werden.

3) Aktivieren Sie mithilfe von aspnet_regsql.exe die SQL-Cache-Abhängigkeit für die Datenbank und die Tabellen, für die Sie Daten zwischenspeichern müssen (dieser Schritt erstellt eine Tabelle zum Verfolgen von Änderungen und Trigger für die Tabellen, um Änderungen zu erfassen und einen Wert in dieser Tabelle zu erhöhen).

4) Richten Sie die SQL-Cache-Abhängigkeit in der .net-Anwendung ein.In einer Web-App müssen Sie beispielsweise Konfigurationswerte für die Abfragezeit, die Verbindungszeichenfolge usw. hinzufügen;Starten/stoppen Sie die Abhängigkeit in Ihrer global.asax.cs und fügen Sie dann SQL-Cache-Abhängigkeiten hinzu, wenn Sie Elemente zu Ihrem Cache hinzufügen.

4a) Ein Teil dessen, was beim Starten der Abhängigkeit passiert, besteht darin, dass die Infrastruktur für eine Warteschlange, einen Dienst und einen Sproc für die anschließende Kommunikation und Bereinigung eingerichtet wird.Mit dem SQL Query Profiler können Sie sehen, wie eine Verbindung hergestellt und ein Kommunikationskanal für den Dienst eingerichtet wird, damit die Anwendung Nachrichten vom SQL Server empfangen kann.

5) Hier bin ich verwirrt.Zu diesem Zeitpunkt habe ich ein Element in meinem Anwendungscache mit einem Verweis auf die SQL-Cache-Abhängigkeit der zugrunde liegenden Tabelle zwischengespeichert, damit meine App Änderungen empfangen kann, falls sich diese Zeile ändert.Wenn ich manuell eine Aktualisierung dieser Zeile ausführe, kann ich sehen, dass der Auslöser getroffen wird und der Wert in der Tracking-Tabelle um 1 erhöht wird.Ich sehe jedoch keine Kommunikation, die zur Anwendung zurückkehrt, nichts im SQL-Abfrageprofiler, und das Element wird auch nicht aus dem Cache entfernt.Ich sehe auch nichts in den Warteschlangen in der Datenbank (weder in der dynamischen Anwendungswarteschlange noch in den Standardfehler-/Übertragungswarteschlangen).

Meine Frage ist: Was überwacht diese Tracking-Tabelle in der Datenbank, damit Nachrichten an die SQL-Abhängigkeiten zurückgesendet werden können, die über Änderungen an diesen Daten besorgt sind?

Jede Hilfe wird sehr geschätzt...Ich habe viele Online-Referenzen durchforstet und kann keine konkrete Erklärung dafür finden.

War es hilfreich?

Lösung

In Ihrer Datenbank wird eine neue Tabelle erstellt, die den Namen der Tabelle enthält, für die Sie nach Aktualisierungen suchen möchten, sowie eine Änderungsnummer.Für jede Tabelle, die Sie für sqldependency eingerichtet haben, ist ein Trigger für Aktualisierungen/Einfügungen eingerichtet, der die Änderungs-ID in der neuen Tabelle, die ich gerade beschrieben habe, erhöht.

Ihr mentales Modell, wie das funktioniert, ist verkehrt herum.Ihre Anwendung überprüft das Protokoll, um festzustellen, ob sich eine Tabelle geändert hat.

Wenn also die Changelog-Tabelle (so nenne ich sie) zwei Tabellen in Ihrer Datenbank (Produkt, Benutzer) verfolgt, sieht das so aus.

+Table Name + ChangeNumber +
| Product   | 1            |
+-----------+--------------+
| User      | 1            |
+-----------+--------------+

Wenn Sie nun etwas in einer dieser Tabellen ändern, erhöht sich der Trigger ChangeNumber und wir wissen jetzt, dass sie sich verändert haben.

Offensichtlich steckt da noch mehr dahinter, aber das ist die allgemeine Idee.

Notiz:Beachten Sie, dass Sie eine Seite ungültig machen können, wenn sich eine oder mehrere Tabellen ändern. Wenn für Ihre Seite also eine Abhängigkeit für beide Tabellen eingerichtet ist, wird bei einer Änderung einer dieser Tabellen die zwischengespeicherte Seite ungültig gemacht und eine aktualisierte Version erneut zwischengespeichert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top