Para activar el cache de datos del SQL en el IIS, debemos ejecutar varios comandos en la consola, encontraremos el aspnet_regsql.exe en la carpeta del framework.
Para registrar el servidor SQL:
- aspnet_regsql.exe -S "NombreDelServidorSql" -E -d "NombreDeLaBaseDeDatos" -ed
Para cada una de las tablas que queramos cachear:
- aspnet_regsql.exe -S "NombreDelServidorSql" -E -d "NombreDeLabaseDeDatos" -et -t "NombreDeLaTabla"
Para poder usar el cache en nuestro servicio o aplicacion ASP.NET debemos añadir una seccion en el Web.config
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000" >
<databases>
<add name="AliasDeLaBaseDeDatos" connectionStringName="ClaveDeLaConnecionString" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
En esta sección definimos el pollTime que es el intervalo, en milisegundos ,en que debe ir a comprobar si las tablas han cambiado, los demas campos creo que estan claros.
Este tema del pollTime no esta muy claro, ya que, aunque la documentacion dice lo que os he puesto, con las pruebas que hice comprobe que el sistema trabaja por notificacion de cambios, osea que vacia el cache cuando detecta que han cambiado los datos …
Una vez configurado el IIS y el web.config de la Aplicación vamos al codigo.
Podemos crear dependencia del cache sobre una tabla con:
SqlCacheDependency cacheDepen = new SqlCacheDependency("AliasDeLaBaseDeDatos", "NombreDeLaTabla");
O podemos crear dependencia sobre varias tablas con:
SqlCacheDependency cacheDepen1 = new SqlCacheDependency("AliasDeLaBaseDeDatos", "NombreDeLaTabla1");
SqlCacheDependency cacheDepen2 = new SqlCacheDependency("AliasDeLaBaseDeDatos", "NombreDeLaTabla2");
AggregateCacheDependency aggDep = new AggregateCacheDependency();
aggDep.Add(cacheDepen1, cacheDepen2);
Ya que el objecto Cache soporta ambos al crear una entrada:
_miCache.Add(key, result, cacheDepen ,
Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
ó
_miCache.Add(key, result, aggDep,
Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
Si lo que cacheais es el resultado de una sentencia SQL, no hay mayor complicacion, podemos usar como Clave (Key) la misma sentencia o su HashCode, pero si lo que cacheamos son resultados que como peticion tienen clases de parametros, ya es otro tema.
Con el segundo supuesto, para la clave del Cache (key) empeze utilizando el GetHashCode de la clase de peticion, pero me di cuenta de que no funciona para esto, para diferencias istancias de la misma clase de peticion con los mismos valores obtienes diferentes HashCode, asi que para la clave, en este caso, os recomiento utilizar el HashCode de la string del Xml que resulta de serializar la clase, esa fue la unica manera de que me funcionara bien.
Para recuperar los datos del cache simplemente:
object
cachedData = __miCache.Get(key);
si el resultado es null, buscar los datos y meterlos en el Cache para la proxima vez
Mas información sobre el tema en MSDN en la web del Guille o en ASP.NET