O SQL Server fornece um mecanismo de notificação de eventos em que o cache distribuído, como NCache pode se registrar para notificação de alteração através SqlCacheDependency e, em seguida, receba notificações do SQL Server quando os dados subjacentes forem alterados no banco de dados. Isso permite NCache para invalidar ou recarregar imediatamente o item em cache correspondente e isso mantém o cache sempre sincronizado com o banco de dados. No entanto, SqlCacheDependency pode se tornar uma maneira muito intensiva de recursos de sincronização do cache com o banco de dados.
Uma alternativa melhor envolve escrever um procedimento armazenado CLR que se conecta com NCache de dentro do SQL Server e atualiza ou invalida diretamente o item em cache correspondente. É mais eficiente em termos de recursos porque não está criando estruturas de dados relacionadas a SqlCacheDependency. E também não dispara eventos .NET para NCache. Em vez disso, abre uma NCache conexão do cliente e informa diretamente NCache invalidar um item em cache ou recarregá-lo. E essa ligação com NCache é altamente otimizado e muito mais rápido e leve que 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
Os procedimentos armazenados ou gatilhos baseados em CLR podem melhorar muito o desempenho do aplicativo em comparação com o SqlCacheDependency que é relativamente mais lento e pode ser esmagador para grandes conjuntos de dados.