SQL Server bietet einen Ereignisbenachrichtigungsmechanismus, bei dem der verteilte Cache wie 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.
Eine bessere Alternative besteht darin, eine gespeicherte CLR-Prozedur zu schreiben, die eine Verbindung herstellt NCache aus SQL Server heraus und aktualisiert oder macht das entsprechende zwischengespeicherte Element direkt ungültig. Es ist ressourceneffizienter, da es keine verwandten Datenstrukturen erstellt SqlCacheDependency. Außerdem werden keine .NET-Ereignisse ausgelöst NCache. Stattdessen öffnet es eine 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.
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:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication
Foundation\SMdiagnostics.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.management.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll' WITH permission_set = unsafe
CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll' WITH permission_set = unsafe
CREATE ASSEMBLY NCache from N'C:\Program Files\NCache\bin\assembly\2.0\Alachisoft.NCache.Web.dll' WITH permission_set = unsafe
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 ...");
}
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
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.