SQL Server proporciona un mecanismo de notificación de eventos donde el caché distribuido como NCache puede registrarse para la notificación de cambios a través de SqlCacheDependency y luego recibir notificaciones de SQL Server cuando los datos subyacentes cambien en la base de datos. Esto permite NCache para invalidar o recargar inmediatamente el elemento correspondiente en caché y esto mantiene el caché siempre sincronizado con la base de datos. Sin embargo, SqlCacheDependency puede convertirse en una forma muy intensiva de recursos de sincronizar la memoria caché con la base de datos.
Una mejor alternativa consiste en escribir un procedimiento almacenado CLR que se conecta con NCache desde dentro de SQL Server y actualiza o invalida directamente el elemento en caché correspondiente. Es más eficiente en el uso de los recursos porque no crea estructuras de datos relacionadas con SqlCacheDependency. Y tampoco activa eventos .NET para NCache. En cambio, abre una NCache conexión del cliente y le dice directamente NCache si invalidar un elemento almacenado en caché o volver a cargarlo. Y esta conexión con NCache está altamente optimizado y es mucho más rápido y ligero que los eventos .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
Los desencadenadores o procedimientos almacenados basados en CLR pueden mejorar en gran medida el rendimiento de la aplicación en comparación con el SqlCacheDependency eso es relativamente más lento y puede ser abrumador para grandes conjuntos de datos.