SQL Server fournit un mécanisme de notification d'événement où le cache distribué comme NCache peut s'enregistrer pour la notification de changement via SqlCacheDependency puis recevez des notifications de SQL Server lorsque les données sous-jacentes changent dans la base de données. Ceci permet NCache pour invalider ou recharger immédiatement l'élément en cache correspondant et cela maintient le cache toujours synchronisé avec la base de données. Cependant, SqlCacheDependency peut devenir un moyen très gourmand en ressources de synchroniser le cache avec la base de données.
Une meilleure alternative consiste à écrire une procédure stockée CLR qui se connecte à NCache depuis SQL Server et met à jour ou invalide directement l'élément mis en cache correspondant. Il est plus économe en ressources car il ne crée pas de structures de données liées à SqlCacheDependency. Et, il ne déclenche pas non plus d'événements .NET pour NCache. Au lieu de cela, il ouvre une NCache connexion client et indique directement NCache s'il faut invalider un élément mis en cache ou le recharger. Et, ce lien avec NCache est hautement optimisé et beaucoup plus rapide et léger que les événements .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
Les procédures stockées ou les déclencheurs basés sur le CLR peuvent grandement améliorer les performances de l'application par rapport aux SqlCacheDependency c'est relativement plus lent et peut être écrasant pour les grands ensembles de données.