Verteiltes Caching ist zu einem sehr wichtigen Bestandteil jeder hochtransaktionalen Anwendung geworden, um sicherzustellen, dass die Datenbank nicht zu einem Skalierbarkeitsengpass wird. Da ein verteilter Cache jedoch eine Kopie Ihrer Anwendungsdaten aufbewahrt, müssen Sie immer sicherstellen, dass er mit Ihrer Datenbank synchronisiert ist. Ohne dies enthält der verteilte Cache ältere veraltete Daten, die Datenintegritätsprobleme verursachen. SQL Server stellt einen Ereignisbenachrichtigungsmechanismus bereit, bei dem die verteilter Cache Gefällt mir NCache kann sich für die Änderungsmitteilung durch registrieren SqlCacheDependency und dann Benachrichtigungen von SQL Server erhalten, wenn sich zugrunde liegende Daten in der Datenbank ändern. Dies erlaubt NCache um das entsprechende zwischengespeicherte Element sofort ungültig zu machen oder neu zu laden, wodurch der Cache immer mit der Datenbank synchronisiert bleibt. Jedoch, SqlCacheDependency kann zu einer sehr ressourcenintensiven Methode zum Synchronisieren des Caches mit der Datenbank werden. Zunächst müssen Sie eine separate erstellen SqlCacheDependency für jedes zwischengespeicherte Element und dies könnte leicht in die Zehntausende, wenn nicht Hunderttausende gehen. Und SQL Server verwendet Datenstrukturen, um jede SqlCachDependency separat zu verwalten, damit alle damit verbundenen Datenänderungen überwacht werden können. Und dies verbraucht viele zusätzliche Ressourcen und kann den Datenbankserver leicht überlasten.
Zweitens löst SQL Server separate .NET-Ereignisse für jede Datenänderung und aus NCache fängt diese Ereignisse ein. Und diese .NET-Ereignisse können sehr umfangreich sein und den Netzwerkverkehr und die Gesamtleistung leicht überfordern NCache und Ihre Bewerbung. Es gibt eine bessere Alternative. Dazu schreiben Sie a Gespeicherte CLR-Prozedur das verbindet mit NCache aus SQL Server heraus und aktualisiert oder macht das entsprechende zwischengespeicherte Element direkt ungültig. Und dann können Sie diese gespeicherte CLR-Prozedur von einem Aktualisierungs- oder Löschauslöser Ihrer Tabelle aus aufrufen. Sie können dies entweder mit SQL Server 2005 oder 2008 und auch mit Oracle 10g oder höher tun, aber nur, wenn es unter Windows läuft. Eine gespeicherte CLR-Prozedur ist ressourceneffizienter, da sie keine zugehörigen Datenstrukturen erstellt SqlCacheDependency. Außerdem werden keine .NET-Ereignisse ausgelöst NCache. Stattdessen öffnet es ein NCache Client-Verbindung und direkt erzählt NCache ob ein zwischengespeichertes Element ungültig gemacht oder neu geladen werden soll. Und diese Verbindung mit NCache ist hochgradig optimiert und viel schneller und leichter als .NET-Ereignisse.
Nachfolgend finden Sie ein Beispiel für die Verwendung einer gespeicherten CLR-Prozedur.
- Kopieren log4net und Protobuf-Netz von Windows GAC zu NCache/bin/assembly/2.0-Ordner (wählen Sie 4.0, wenn die Zielplattform .NET 4.0 ist).
2. Registrieren NCache und folgenden Assemblys in SQL Server. Beispiel ist unten angegeben. In diesem Beispiel verwenden wir Northwind als Beispieldatenbank.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
use Northwind alter database Northwind set trustworthy on; go drop assembly SMdiagnostics drop assembly [System.Web] drop assembly [System.Messaging] drop assembly [System.ServiceModel] drop assembly [System.Management] CREATE ASSEMBLY SMdiagnostics AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv3.0Windows Communication FoundationSMdiagnostics.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.Web.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.management.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv2.0.50727System.Messaging.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.ServiceModel.dll' WITH permission_set = unsafe CREATE ASSEMBLY NCache FROM N'C:Program FilesNCachebinassembly2.0Alachisoft.NCache.Web.dll' WITH permission_set = unsafe |
3. Öffnen Sie Visual Studio, um eine gespeicherte Prozedur dagegen zu schreiben NCache Und erstellen Sie ein SQL CLR-Datenbankprojekt wie unten erwähnt. Fügen Sie einen Verweis auf die hinzu NCache Assembly, die Sie im letzten Schritt erstellt haben. Die Assembly, auf die Sie verweisen müssen, ist oben hervorgehoben. Es erscheint unter SQL Server mit dem gleichen Namen wie „NCache".
4. Schreiben Sie Ihre gespeicherte Prozedur. Hier ist ein Beispielcode angegeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void TestSProc(string cacheName) { //--- Put your code here SqlPipe sp = SqlContext.Pipe; try { sp.Send("Starting ....."); if (string.IsNullOrEmpty(cacheName)) cacheName = "mycache"; Cache _cache = NCache.InitializeCache(cacheName); _cache.Insert("key", DateTime.Now.ToString()); sp.Send("Test is completed ..."); } |
5. Aktivieren Sie die CLR-Integration in der Datenbank wie unten angegeben:
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Stellen Sie die gespeicherte Prozedur aus Visual Studio bereit und testen Sie sie.
7. Nachdem Sie die gespeicherte Prozedur bereitgestellt haben, müssen Sie Ihre Assembly der gespeicherten Prozedur in (C:Program FilesNCachebinassembly2.0)-Ordner, da er Assemblyverweise nicht direkt aus dem Windows-GAC-Ordner auflöst und sie lokal benötigt.
CLR-basierte gespeicherte Prozeduren oder Trigger können die Anwendungsleistung im Vergleich zu erheblich verbessern SqlCacheDependency das ist relativ langsam und kann bei großen Datasets überwältigend sein.
SQLCacheDependency hat an sich keine Probleme. Wenn Ihre Anwendung Änderungen an die Datenbank festschreibt, besteht die beste Methode darin, einen verteilten Cache dazwischen zu fügen, um die Abhängigkeit zu handhaben und folglich an die Datenbank festzuschreiben. Nur in zwei Szenarien sucht man nach alternativen Lösungen.
Einer ist, wenn eine andere Anwendung die Änderungen an der Datenbank vornimmt und Sie keine Kontrolle darüber haben oder sie nicht anweisen können, den Cache für DB-Commits zu verwenden.
Der zweite Grund könnte sein, wenn Sie viele Abhängigkeiten für jede Tabelle haben möchten oder Sie eine Umgebung mit vielen DB-Schreibvorgängen/-Aktualisierungen haben, dann können Sie Polling Dependency verwenden. Es wird die Datenbank abfragen, um Änderungen und ungültige Elemente im Cache zu erkennen.
Weitere Informationen finden Sie in diesem Dokument: https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
Hallo Iqbal,
Ich versuche, diesem Artikel zu folgen, erhalte jedoch die folgende Fehlermeldung, wenn ich das SQL-Skript ausführe.
Nachricht 6544, Ebene 16, Status 1, Zeile 26
CREATE ASSEMBLY für die Assembly „System.ServiceModel“ ist fehlgeschlagen, da die Assembly „microsoft.visualbasic.activities.compiler“ fehlerhaft oder keine reine .NET-Assembly ist.
Wenn die Verwendung von WCF innerhalb einer SQLCLR-Prozedur nicht mehr unterstützt wird, was ist die empfohlene Methode der Cachesynchronisierung, während Leistungsprobleme vermieden werden SqlCacheDependency.
Danke, Ryan.
Dieser Beitrag wurde aktualisiert. Jetzt funktionieren alle Schritte mit NCache 4.1
Hallo Sergey,
Bitte laden Sie den Fix herunter, der dieses Problem in Ihrer Umgebung behebt. Diese Implementierung wurde zusätzlich bereitgestellt NCache 4.1-Version und wird erst kompatibel sein, nachdem der folgende Fix angewendet wurde.
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
Bitte lesen Sie die Datei „Readme.txt“ im Patch, um sie in Ihrer Umgebung anzuwenden.
Derzeit wird dieser Fix für die Cache Server-Installation bereitgestellt und enthält nur .Net 2.0-Assemblys. Sie können dies in Ihrer Umgebung testen und verifizieren, wir können Ihnen einen vollständigen Patch speziell für .NET und .NET bereitstellen NCache Einbau nach Bedarf.
Darüber hinaus müssen Sie sicherstellen, dass Sie nach dem Bereitstellen der gespeicherten Prozedur Ihre Assembly der gespeicherten Prozedur in (C:Program FilesNCachebinassembly2.0)-Ordner, da er Assemblyverweise nicht direkt aus dem Windows-GAC-Ordner auflöst und sie lokal benötigt.
Bitte lass mich wissen wie es gelaufen ist
Hallo Iqbal,
Ich habe die gespeicherte CLR-Prozedur wie in Absatz 5 beschrieben mit demselben Code erstellt. Wenn ich versuche, sie auszuführen, wird die folgende Ausnahme ausgelöst:
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException: Beim Lesen von client.ncconf ist ein Fehler aufgetreten.
Es scheint, dass NCache kann die Konfigurationsdatei nicht finden, aber die Datei existiert im Installationsverzeichnis C:ProgrammeNCacheConfig
Bitte helfen Sie.
Vielen Dank
Sergey