El almacenamiento en caché distribuido se ha convertido en una parte muy importante de cualquier aplicación de alta transacción para garantizar que la base de datos no se convierta en un cuello de botella de escalabilidad. Pero, dado que un caché distribuido guarda una copia de los datos de su aplicación, siempre debe asegurarse de que se mantenga sincronizado con su base de datos. Sin esto, la caché distribuida tiene datos obsoletos más antiguos que causan problemas de integridad de datos. SQL Server proporciona un mecanismo de notificación de eventos donde el caché distribuida 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. En primer lugar, debe crear un archivo separado SqlCacheDependency para cada elemento almacenado en caché y esto fácilmente podría llegar a decenas de miles, si no cientos de miles. Y, SQL Server usa estructuras de datos para mantener cada SqlCachDependency por separado para que pueda monitorear cualquier cambio de datos relacionado con él. Y esto consume una gran cantidad de recursos adicionales y puede ahogar fácilmente el servidor de la base de datos.
En segundo lugar, SQL Server dispara eventos .NET separados para cada cambio de datos y NCache captura estos eventos. Y estos eventos de .NET pueden ser bastante pesados y fácilmente podrían abrumar el tráfico de red y el rendimiento general de NCache y su aplicación. Hay una alternativa mejor. Esto implica que usted escriba un Procedimiento almacenado CLR que conecta con NCache desde dentro de SQL Server y actualiza o invalida directamente el elemento en caché correspondiente. Y luego puede llamar a este procedimiento almacenado CLR desde un activador de actualización o eliminación de su tabla. Puede hacer esto con SQL Server 2005 o 2008 y también desde Oracle 10g o posterior, pero solo si se ejecuta en Windows. Un procedimiento almacenado CLR es más eficiente en recursos porque no crea estructuras de datos relacionadas con SqlCacheDependency. Y tampoco activa eventos .NET para NCache. En su lugar, 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.
A continuación se muestra un ejemplo de cómo utilizar un procedimiento almacenado CLR.
- Copiar log4net y protobuf-net de Windows GAC a NCacheCarpeta /bin/assembly/2.0 (elija 4.0 si la plataforma de destino es .NET 4.0).
2. Registrarse NCache y siguientes ensamblajes en el servidor SQL. El ejemplo se da a continuación. En este ejemplo, estamos utilizando Northwind como base de datos de muestra.
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. Abra Visual Studio para escribir un procedimiento almacenado contra NCache Y cree un proyecto de base de datos SQL CLR como se menciona a continuación. Agregar una referencia a la NCache ensamblaje que creó en el último paso. La asamblea que necesita consultar se destaca arriba. Aparecerá en SQL Server con el mismo nombre que "NCache.
4. Escriba su procedimiento almacenado. Aquí hay un código de muestra dado:
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. Habilite la integración de CLR en la base de datos como se indica a continuación:
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Implemente el procedimiento almacenado desde Visual Studio y pruébelo.
7. Después de implementar el procedimiento almacenado, debe colocar el ensamblaje del procedimiento almacenado en (C: Archivos de programaNCachebinassembly2.0) ya que no resuelve las referencias de ensamblaje directamente desde la carpeta GAC de Windows y las necesita localmente.
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.
SQLCacheDependency no tiene problemas en sí mismo. Si tiene su aplicación realizando cambios en la base de datos, la mejor práctica es agregar una memoria caché distribuida en el medio para manejar la dependencia y, en consecuencia, realizar cambios en la base de datos. Solo en dos escenarios se buscan soluciones alternativas.
Una es cuando alguna otra aplicación está realizando los cambios en la base de datos y usted no tiene ningún control sobre ella o no puede indicarle que use el caché para realizar confirmaciones de base de datos.
La segunda razón podría ser cuando desea tener muchas dependencias en cada tabla o tiene un entorno de escritura/actualización de base de datos alto, entonces puede usar la dependencia de sondeo. Sondeará la base de datos para detectar cualquier cambio y los elementos invalidados en el caché.
Para más información consulte este documento: https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
Hola Iqbal,
Estoy tratando de seguir este artículo, sin embargo, recibo el siguiente error al ejecutar el script SQL.
Msg 6544, nivel 16, estado 1, línea 26
CREATE ASSEMBLY para el ensamblado 'System.ServiceModel' falló porque el ensamblado 'microsoft.visualbasic.activities.compiler' tiene un formato incorrecto o no es un ensamblado .NET puro.
Si ya no se admite el uso de WCF desde dentro de un procedimiento SQLCLR, ¿cuál es el método recomendado de sincronización de caché mientras se evitan los problemas de rendimiento con SqlCacheDependency.
Gracias, Ryan.
Esta publicación ha sido actualizada. Ahora todos los pasos funcionan con NCache 4.1
Hola, Sergey,
Descargue la solución que resolverá este problema en su entorno. Esta implementación se proporcionó además de NCache 4.1 y será compatible solo después de aplicar la corrección a continuación.
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
Consulte el archivo "Readme.txt" en el parche para aplicarlo en su entorno.
Actualmente, esta solución se proporciona para la instalación del servidor de caché y solo contiene ensamblajes .Net 2.0, puede probar y verificar esto en su entorno, podemos proporcionarle un parche completo específico para .NET y NCache instalación bajo demanda.
Además, debe asegurarse de que después de implementar el procedimiento almacenado, debe colocar el ensamblaje del procedimiento almacenado en (C: Archivos de programaNCachebinassembly2.0) ya que no resuelve las referencias de ensamblaje directamente desde la carpeta GAC de Windows y las necesita localmente.
hágame saber como va por favor
Hola Iqbal,
Creé el proceso almacenado CLR como lo describiste con el mismo código que en el párrafo 5. Cuando intento ejecutarlo, arroja la siguiente excepción:
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException: Se produjo un error al leer client.ncconf.
Parece que NCache no se puede encontrar el archivo de configuración, pero el archivo existe en el directorio de instalación C: Archivos de programaNCacheconfig
Por favor, ayuda.
Muchas Gracias
Sergey