La mise en cache distribuée est devenue une partie très importante de toute application à transactions élevées afin de garantir que la base de données ne devienne pas un goulot d'étranglement pour l'évolutivité. Mais, puisqu'un cache distribué conserve une copie des données de votre application, vous devez toujours vous assurer qu'il reste synchronisé avec votre base de données. Sans cela, le cache distribué contient des données obsolètes plus anciennes qui causent des problèmes d'intégrité des données. 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. Tout d'abord, vous devez créer un SqlCacheDependency pour chaque élément mis en cache et cela pourrait facilement atteindre des dizaines de milliers, voire des centaines de milliers. De plus, SQL Server utilise des structures de données pour gérer chaque SqlCachDependency séparément afin de pouvoir surveiller toutes les modifications de données qui lui sont associées. Et cela consomme beaucoup de ressources supplémentaires et peut facilement étouffer le serveur de base de données.
Deuxièmement, SQL Server déclenche des événements .NET distincts pour chaque modification de données et NCache capte ces événements. De plus, ces événements .NET peuvent être assez lourds et pourraient facilement submerger le trafic réseau et les performances globales de NCache et votre candidature. Il existe une meilleure alternative. Cela implique que vous écriviez un Procédure stockée CLR qui se connecte avec NCache depuis SQL Server et met à jour ou invalide directement l'élément mis en cache correspondant. Et, ensuite, vous pouvez appeler cette procédure stockée CLR à partir d'un déclencheur de mise à jour ou de suppression de votre table. Vous pouvez le faire avec SQL Server 2005 ou 2008 et également à partir d'Oracle 10g ou version ultérieure, mais uniquement s'il s'exécute sous Windows. Une procédure stockée CLR est plus économe en ressources car elle 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 un 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.
Vous trouverez ci-dessous un exemple d'utilisation d'une procédure stockée CLR.
- Copier log4net ainsi que protobuf-net de Windows GAC à NCache/bin/assembly/2.0 dossier (choisissez 4.0 si la plate-forme cible est .NET 4.0).
2. Inscrivez-vous NCache et les assemblages suivants dans SQL Server. Un exemple est donné ci-dessous. Dans cet exemple, nous utilisons Northwind comme exemple de base de données.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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:WindowsMicrosoft.NETFrameworkv3.0Windows Communication FoundationSMdiagnostics.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.Web.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.management.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv2.0.50727System.Messaging.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.ServiceModel.dll' WITH permission_set = unsafe CREATE ASSEMBLY NCache FROM N'C:Program FilesNCachebinassembly2.0Alachisoft.NCache.Web.dll' WITH permission_set = unsafe |
3. Ouvrez Visual Studio pour écrire une procédure stockée contre NCache Et créez un projet de base de données SQL CLR comme mentionné ci-dessous. Ajouter une référence au NCache l'assemblage que vous avez créé à la dernière étape. L'assembly auquel vous devez vous référer est mis en surbrillance ci-dessus. Il apparaîtra sous SQL Server avec le même nom que "NCache ».
4. Écrivez votre procédure stockée. Voici un exemple de code donné :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 ..."); } |
5. Activez l'intégration CLR sur la base de données comme indiqué ci-dessous :
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Déployez la procédure stockée à partir de Visual Studio et testez-la.
7. Après avoir déployé la procédure stockée, vous devez placer votre assembly de procédure stockée dans (C:Program FilesNCachebinassembly2.0) car il ne résout pas les références d'assemblage directement à partir du dossier Windows GAC et en a besoin localement.
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.
SQLCacheDependency n'a pas de problèmes en soi. Si votre application valide des modifications dans la base de données, la meilleure pratique consiste à ajouter un cache distribué entre les deux pour gérer la dépendance et, par conséquent, valider la base de données. Ce n'est que dans deux scénarios que vous recherchez des solutions alternatives.
La première est lorsqu'une autre application apporte des modifications à la base de données et que vous n'avez aucun contrôle sur elle ou que vous ne pouvez pas lui demander d'utiliser le cache pour effectuer des validations de base de données.
La deuxième raison peut être lorsque vous souhaitez avoir de nombreuses dépendances sur chaque table ou que vous avez un environnement d'écritures/mises à jour élevé dans la base de données, vous pouvez alors utiliser la dépendance d'interrogation. Il interrogera la base de données pour détecter tout changement et les éléments invalidés dans le cache.
Pour plus d'informations, reportez-vous à ce document : https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
Bonjour Iqbal,
J'essaie de suivre cet article mais j'obtiens l'erreur suivante lors de l'exécution du script SQL.
Msg 6544, niveau 16, état 1, ligne 26
CREATE ASSEMBLY pour l'assembly 'System.ServiceModel' a échoué car l'assembly 'microsoft.visualbasic.activities.compiler' est malformé ou n'est pas un assembly .NET pur.
Si l'utilisation de WCF à partir d'une procédure SQLCLR n'est plus prise en charge, quelle est la méthode recommandée de synchronisation du cache tout en évitant les problèmes de performances avec SqlCacheDependency.
Merci Ryan.
Cette publication a été mise à jour. Maintenant, toutes les étapes fonctionnent avec NCache 4.1
Salut Sergey,
Veuillez télécharger le correctif qui résoudra ce problème dans votre environnement. Cette implémentation a été fournie en plus de NCache 4.1 et ne sera compatible qu'après avoir appliqué le correctif ci-dessous.
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
Veuillez vous référer au fichier "Readme.txt" dans le patch pour l'appliquer dans votre environnement.
Actuellement, ce correctif est fourni pour l'installation du serveur de cache et contient uniquement les assemblages .Net 2.0, vous pouvez tester et vérifier cela dans votre environnement, nous pouvons vous fournir un correctif complet spécifique à .NET et NCache mise en place à la demande.
De plus, vous devez vous assurer qu'après avoir déployé la procédure stockée, vous devez placer votre assembly de procédure stockée dans (C:Program FilesNCachebinassembly2.0) car il ne résout pas les références d'assemblage directement à partir du dossier Windows GAC et en a besoin localement.
Merci de me dire comment ça se passe
Bonjour Iqbal,
J'ai créé le proc stocké CLR comme vous l'avez décrit avec le même code qu'au paragraphe 5. Lorsque j'essaie d'exécuter, il lève l'exception suivante :
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException : une erreur s'est produite lors de la lecture de client.ncconf.
Semble que NCache Impossible de trouver le fichier de configuration, mais le fichier existe dans le répertoire d'installation C:Program FilesNCacheconfig
S'il vous plaît aider.
Merci
Sergey