Unter .NET 1.1 kann Cache nur Cache-Abhängigkeiten basierend auf Dateisystemen, Objekten usw. erstellen, aber .NET 2.0 bietet eine neue Abhängigkeit, SqlCacheDependency, die es unserem Cache ermöglicht, von Änderungen in der Datenbank abhängig zu sein. Obwohl dieser Ansatz der Problemumgehung in 1.1 ähnelt, gibt es einen wesentlichen Unterschied zwischen ihnen (die Bereitstellung des SqlCacheDependency-Objekts). (Die Problemumgehung für 1.1 besteht darin, einen Trigger für die Datentabelle zu erstellen. Anschließend ändert der Trigger beim Auslösen eine lokale Datei. Die Abhängigkeit eines bestimmten Caches im System ist diese lokale Datei, um den Cache über den Cache zu informieren Daten geändert)
Die SqlCacheDependency von .NET 2.0 kann in Versionen nach SqlServer2000 verwendet werden. In diesem Artikel wird die Verwendung unter Sql Server 2000 beschrieben. Sql Server 2005 ist etwas anders.
Zuerst müssen Sie das .NET 2.0-Framework installieren. Natürlich muss SQL Server 2000 verfügbar sein. In .NET 2.0 stellt Microsoft ein Dienstprogramm bereit: aspnet_regsql (im selben Verzeichnis wie aspnet_regiis). Die Befehlszeilenparameter können über aspnet_regsql -? abgerufen werden. Dabei kümmern wir uns um die folgenden Parameter: -ed startet die Datenbank für SQL-Cache-Abhängigkeiten, -E verwendet die aktuellen Windows-Anmeldeinformationen zur Authentifizierung, -d wird für den Datenbanknamen des Anwendungsservers verwendet, wenn kein Datenbankname angegeben ist, der Standard Als Datenbank wird „aspnetdb“ verwendet. In diesem Artikel werden die Beispieldatenbank-Pubs von Microsoft verwendet. Dann müssen wir die folgende Befehlszeile verwenden, um die Cache-abhängige Datenbank zu erstellen:
aspnet_regsql -ed -E -d pubs
(Hinweis: Bei den Befehlszeilenparametern muss die Groß-/Kleinschreibung beachtet werden.)
Nach der Ausführung dieses Befehls können wir die Pubs-Datenbank öffnen, um zu sehen, welche Änderungen vorgenommen wurden: AspNet_SqlCacheTablesForChangeNotification. Diese Tabelle enthält 3 Felder: tableName Tabellenname, notificationCreated: Erstellungszeit. changeId: Änderungsnummer (kumuliertes Feld). Sie können auch sehen, dass die Datenbank über mehrere weitere gespeicherte Prozeduren verfügt:
AspNet_SqlCacheRegisterTableStoredProcedure,
AspNet_SqlCacheUnRegisterTableStoredProcedure,
AspNet_SqlCacheUpdateChangeIdStoredProcedure,
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,
AspNet_SqlCachePollingStoredProcedure
Diese gespeicherten Prozeduren sind wörtlich leicht zu verstehen. Die Details der gespeicherten Prozedur können nach dem Öffnen im Abfrageanalysator angezeigt werden. Um Änderungen in einer Tabelle zu überwachen, müssen wir eine zu überwachende Tabelle angeben, indem wir die gespeicherte Prozedur AspNet_SqlCacheRegisterTableStoredProcedure ausführen. Natürlich kann sie auch über das Dienstprogramm aspnet_regsql angegeben werden. Die Befehlszeile lautet wie folgt:
aspnet_regsql -et -E -d pubs -t Autoren
Nach der Ausführung des obigen Befehls erstellt aspnet_regsql einen Trigger für Autoren. Der folgende Trigger ist der, den ich nach der Ausführung des Befehls erstellt habe:
SETZEN SIE QUOTED_IDENTIFIER EIN
GEHEN
SETZEN SIE ANSI_NULLS AUF
GEHEN
ALTER TRIGGER dbo.[authors_AspNet_SqlCacheNotification_Trigger] ON [Autoren]
FÜR EINFÜGEN, AKTUALISIEREN, DELETE AS BEGIN
NOCOUNT EINSTELLEN
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'authors'
ENDE
GEHEN
SETZEN SIE QUOTED_IDENTIFIER AUS
GEHEN
SETZEN SIE ANSI_NULLS AUF
GEHEN
Wie aus dem Trigger hervorgeht, wird die gespeicherte Prozedur AspNet_SqlCacheUpdateChangeIdStoredProcedure ausgeführt, wenn die Autorentabelle eingefügt, gelöscht und aktualisiert wird. Diese gespeicherte Prozedur fügt der Tabelle AspNet_SqlCacheTablesForChangeNotification einen Datensatz hinzu. Die Aufzeichnung lautet wie folgt:
Tabellenname-BenachrichtigungErstellte ChangeId
Autoren 20.06.2006 09:38:26.267 1
Wenn Sie Änderungen an den Daten in „Autoren“ vornehmen, wird die Änderungs-ID akkumuliert und andere Felder werden nicht geändert.
Dann müssen Sie einige Inhalte in web.config hinzufügen und können diese verwenden.
Fügen Sie zunächst die Datenbankverbindungszeichenfolge hinzu:
<connectionStrings>
<add name="pubsConString" ConnectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
</connectionStrings>
Zweitens fügen Sie den Cache-Abschnitt hinzu:
<system.web>
<caching>
<sqlCacheDependency aktiviert="true">
<Datenbanken>
<add name="pubs" ConnectionStringName="pubsConString" pollTime="900"/>
</Datenbanken>
</sqlCacheDependency>
</caching>
</system.web>
Das Folgende ist der Testcode. Wenn die Seite geladen wird, wird der folgende Code ausgeführt:
protected void Page_Load(object sender, EventArgs e) {
if (HttpContext.Current.Cache["xxx"] == null) {
SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs sind die im Datenbankabschnitt angegebenen Pubs, gefolgt vom Tabellennamen
HttpContext.Current.Cache.Insert("xxx", "xxx", d);
Response.Write("Neuen Cache-Wert erstellen ist xxx.");
}
anders{
Response.Write("Daten aus Cache laden, Wert ist "+HttpContext.Current.Cache["xxx"].ToString());
}
}
Beim ersten Öffnen dieser Seite wird Folgendes angezeigt:
Der Wert für „Neuen Cache erstellen“ ist xxx.
Nach dem Aktualisieren der Seite wird Folgendes angezeigt:
Daten aus dem Cache laden, Wert ist xxx
Wenn Sie den Abfrageanalysator verwenden, um die Daten in „Autoren“ zu ändern und die Seite erneut zu aktualisieren, wird Folgendes angezeigt:
Der Wert „Neuen Cache erstellen“ ist xxx.
Dies zeigt, dass der Cache normal funktioniert. Wenn sich die Autorentabelle ändert, wird der Inhalt im Cache automatisch ungültig und meine Anwendung erstellt auch ein Cache-Objekt neu.
Hinweis: SqlCacheDependency besteht aus zwei Konstruktoren, SqlServer2000 unterstützt nur zwei Parameter und ein Parameter unterstützt SqlServer2005.