La memorizzazione nella cache distribuita è diventata una parte molto importante di qualsiasi applicazione con transazioni elevate per garantire che il database non diventi un collo di bottiglia per la scalabilità. Tuttavia, poiché una cache distribuita conserva una copia dei dati dell'applicazione, è necessario assicurarsi sempre che sia mantenuta sincronizzata con il database. Senza questo, la cache distribuita ha dati obsoleti meno recenti che causano problemi di integrità dei dati. SQL Server fornisce un meccanismo di notifica degli eventi in cui il cache distribuita piace 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. Prima di tutto, devi crearne uno separato SqlCacheDependency per ogni elemento memorizzato nella cache e questo potrebbe facilmente arrivare a decine di migliaia se non centinaia di migliaia. Inoltre, SQL Server utilizza strutture di dati per mantenere ogni SqlCachDependency separatamente in modo da poter monitorare eventuali modifiche ai dati ad essa correlate. E questo consuma molte risorse extra e può facilmente soffocare il server del database.
In secondo luogo, SQL Server genera eventi .NET separati per ogni modifica dei dati e NCache coglie questi eventi. Inoltre, questi eventi .NET possono essere piuttosto pesanti e potrebbero facilmente sovraccaricare il traffico di rete e le prestazioni complessive di NCache e la tua candidatura. C'è un'alternativa migliore. Ciò implica che tu scriva a Procedura memorizzata CLR che si collega con NCache da SQL Server e aggiorna o invalida direttamente l'elemento memorizzato nella cache corrispondente. E, quindi, puoi chiamare questa stored procedure CLR da un aggiornamento o eliminare il trigger della tua tabella. Puoi farlo con SQL Server 2005 o 2008 e anche da Oracle 10g o versioni successive, ma solo se è in esecuzione su Windows. Una stored procedure CLR è 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.
Di seguito è riportato un esempio di come utilizzare una stored procedure CLR.
- Copia log4net ed protobuf-net da Windows GAC a NCacheCartella /bin/assembly/2.0 (scegliere 4.0 se la piattaforma di destinazione è .NET 4.0).
2. Registrati NCache e gli assembly seguenti in SQL Server. L'esempio è riportato di seguito. In questo esempio utilizziamo Northwind come database di esempio.
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. Aprire Visual Studio per scrivere una stored procedure su NCache E crea un progetto di database CLR SQL come indicato di seguito. Aggiungi un riferimento al NCache assieme creato nell'ultimo passaggio. L'assieme a cui è necessario fare riferimento è evidenziato sopra. Apparirà in SQL Server con lo stesso nome di "NCache".
4. Scrivi la tua procedura memorizzata. Ecco un codice di esempio fornito:
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. Abilitare l'integrazione CLR sul database come indicato di seguito:
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Distribuire la stored procedure da Visual Studio e testarla.
7. Dopo aver distribuito la stored procedure, è necessario posizionare l'assembly della stored procedure in (C:ProgrammiNCachebinassembly2.0) in quanto non risolve i riferimenti all'assieme direttamente dalla cartella GAC di Windows e ne ha bisogno in locale.
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.
SQLCacheDependency non ha problemi di per sé. Se la tua applicazione esegue il commit delle modifiche al database, la procedura migliore consiste nell'aggiungere una cache distribuita in mezzo per gestire la dipendenza e di conseguenza eseguire il commit nel database. Solo in due scenari si cercano soluzioni alternative.
Uno è quando un'altra applicazione sta apportando le modifiche al database e non hai alcun controllo su di esso o non puoi indirizzarlo a utilizzare la cache per eseguire commit DB.
Il secondo motivo potrebbe essere quando si desidera avere molte dipendenze su ciascuna tabella o si dispone di un ambiente di scritture/aggiornamenti DB elevato, è possibile utilizzare la dipendenza di polling. Eseguirà il polling del database per rilevare eventuali modifiche e invalidare gli elementi nella cache.
Per maggiori informazioni fare riferimento a questo documento: https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
Ciao Iqbal,
Sto cercando di seguire questo articolo, tuttavia ricevo il seguente errore durante l'esecuzione dello script SQL.
Messaggio 6544, livello 16, stato 1, riga 26
CREATE ASSEMBLY per l'assembly 'System.ServiceModel' non è riuscito perché l'assembly 'microsoft.visualbasic.activities.compiler' non è valido o non è un assembly .NET puro.
Se l'utilizzo di WCF dall'interno di una procedura SQLCLR non è più supportato, qual è il metodo consigliato per la sincronizzazione della cache evitando i problemi di prestazioni con SqlCacheDependency.
Grazie, Ryan.
Questo post è stato aggiornato. Ora tutti i passaggi funzionano con NCache 4.1
Ciao Sergey,
Scarica la correzione che risolverà questo problema nel tuo ambiente. Questa implementazione è stata fornita in aggiunta NCache 4.1 e sarà compatibile solo dopo aver applicato la correzione seguente.
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
Fare riferimento al file "Readme.txt" nella patch per applicarlo nel proprio ambiente.
Attualmente questa correzione viene fornita per l'installazione di Cache Server e contiene solo assembly .Net 2.0, puoi testarlo e verificarlo nel tuo ambiente, possiamo fornirti patch complete specifiche per .NET e NCache installazione su richiesta.
Inoltre, è necessario assicurarsi che, dopo aver distribuito la procedura memorizzata, sia necessario posizionare l'assembly della procedura memorizzata in (C:ProgrammiNCachebinassembly2.0) in quanto non risolve i riferimenti all'assieme direttamente dalla cartella GAC di Windows e ne ha bisogno in locale.
Per favore fammi sapere come va
Ciao Iqbal,
Ho creato il processo memorizzato CLR come hai descritto con lo stesso codice del paragrafo 5. Quando provo a eseguire, genera la seguente eccezione:
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException: si è verificato un errore durante la lettura di client.ncconf.
Sembra quello NCache impossibile trovare il file di configurazione, ma il file esiste nella directory di installazione C:ProgrammiNCacheconfig
Per favore aiuto.
Grazie
Sergey