SQL Server fornisce un meccanismo di notifica degli eventi a cui piace la cache distribuita NCache può registrarsi per la notifica di modifica tramite SqlCacheDependency e quindi ricevere notifiche da SQL Server quando i dati sottostanti cambiano nel database. Questo permette NCache per invalidare o ricaricare immediatamente l'elemento memorizzato nella cache corrispondente e questo mantiene la cache sempre sincronizzata con il database. Tuttavia, SqlCacheDependency può diventare un modo ad alta intensità di risorse per sincronizzare la cache con il database.
Un'alternativa migliore prevede la scrittura di una stored procedure CLR che si connette a NCache da SQL Server e aggiorna o invalida direttamente l'elemento memorizzato nella cache corrispondente. È più efficiente in termini di risorse perché non crea strutture di dati correlate SqlCacheDependency. Inoltre, non genera eventi .NET su NCache. Invece, si apre un NCache connessione client e dice direttamente NCache se invalidare un elemento memorizzato nella cache o ricaricarlo. E, questa connessione con NCache è altamente ottimizzato e molto più veloce e leggero degli eventi .NET.
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
Le stored procedure o i trigger basati su CLR possono migliorare notevolmente le prestazioni dell'applicazione rispetto a SqlCacheDependency che è relativamente più lento e può essere opprimente per set di dati di grandi dimensioni.