Tutorial de ASP.NET
Vista Previa de ASP.NET 2.0

Invalidación de la cache SQL (Nuevo en 2.0 )

En el ejemplo anterior, los datos eran guardados en cache durante 60 segundos, sin tener en cuenta si los datos han cambiado en la base de datos. El mecanismo de invalidación de la cache de SQL le permite establecer un elemento de la cache dependiente dela base de datos, de forma que el elemento de la cache se borrará cuando la base de datos cambie.

<a name="polling">

Invalidación basada en sondeos 

Este mecanismo usa un sondeo para comprobar si una tabla ha sido actualizada desde que la página se guardó en la caché. Para habilitar la caché basada en tabla se requieren los siguientes pasos:

1)

Habilitar las notificaciones de la base de datos utilizando la herramienta aspnet_regsql.exe

>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -ed

Este paso sólo hace falta hacerlo una vez por cada base de datos.

2)

Habilitar las notificaciones para la tablas o las tablas que quiere que tenga las dependencias utilizando la herramienta aspnet_regsql.exe


>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -et -t "authors"

3)

Registrar la notificacion en el fichero de configuraciónd de la aplicación:


<system.web>
        <caching>
                <sqlCacheDependency enabled="true" pollTime="1000" >
                        <databases>
                                <add name="PubsDB" connectionStringName="Pubs" />
                        </databases>
                </sqlCacheDependency>
        </caching>
</system.web>

El tiempo de sondeo indica la frecuencia con que la aplicación comprueba si los datos han cambiado
 

4)

Ahora ya se puede utilizar una dependencia SQL en la directiva OutputCache:



<%@ OutputCache Duration="999999" SqlDependency="Pubs:Authors" VaryByParam="none" %>

O bien, indicarlo directamente en el control DataSource:

<asp:SqlDataSource EnableCaching="true" CacheDuration="Infinite" SqlCacheDependency="PubsDB:Authors" ... />

El siguiente ejemplo usa una cacheé de salida para un datasource de sql usando una notificación basada en tablas. Observad el valor de fecha y hora al final de la aplicación qué debería permanecer estático. Puede usar el ejemplo del GridView para editar los datos. El refresco de la página debería actualizar los datos y poner un nuevo valor de fecha y hora

 
C# SqlCacheDependency


Invalidación Caché basada en Notificaciones de SQL Server 2005

Este mecanismo usa el mecanismo de notificación de cambios en las consultas de SQL Server 2005 para detectar cambios en el resultados de las consultas. Al contrario que la invalidación de SQL Server 7.0 y 2000 basado en los sondeos, esta invalidación requiere mucho menos trabajo de configuración.

  1. Al contración que en la validación por sondeos, no se necesita indicar la entrada <sqlCacheDependency> en la configuración de la aplicación. Además, tampoco hace falta una configuración especial utilizando la herramienta aspnet_regsql.exe

  2. Se configura una notificación basada en dependencia de sql en la directiva OutputCache, utilizando la cadena CommandNotification. Este valor le indica a ASP.NET que se va a utilizar una dependencia basada en notificaciones para la página o un control DataSource

    Para la página:


    <%@ OutputCache Duration="999999" SqlDependency="CommandNotification" VaryByParam="none" %>

    Para el control Datasource:


    <asp:SqlDataSource EnableCaching="true" SqlCacheDependency="CommandNotification" CacheDuration="Infinite" ... />

  3. Se debe llamar al metodo System.Data.SqlClient.SqlDependency.Start() en algun lugar de la aplicación antes de que se ejecute la primera consulta SQL. Esta llamada puede ponerse en el evento Application_Start() del fichero global.asax.

  

Siempre que un comando está relacionado con SQL Server 2005, ASP.NET y ADO.NET automáticamente crearán una dependencia de caché que escuche las notificaciones de cambios enviados por SQL Server. Cuando se cambia un dato en SQL Server, esta notificación provocará la invalidación de las consultas en la caché del servidor web. La proxima vez que se solicite una pagina o control DataSource asociado con la dependencia, la página o el control serán ejecutados en vez de obtener la información del caché.

Algunos puntos a tener encuenta para que las notificaciones funcionen correctamente son:

  1. Las consultas deben indicar explicitamente los nombres de las columnas en la clausula Select. Si se usa "SELECT *" los resultados de la consulta no se registraran para las notificaciones de SQL 2005.
  2. Los nombres de las tablas deben incluir el nombre del propietario. Por ejemplo, si quiere obtener una consulta de la tabla author de la base de datos pubs, la consultade debe referenciar a la tabla como "dbo.authors".
  3. El usuario de SQL Server 2005 que está ejecutando la consulta tiene que tener permiso para registrar consultas para notificaciones. El siguiente comando Transact SQL otorga esos derechos : GRANT SUBSCRIBE QUERY NOTIFICATIONS TO username.
  4. El usuario de SQL Server 2005 que está ejecutanto la consulta tambien tiene que tener derechos para enviar notificaciones desde SQL Server 2005. El siguiente comando Transact SQL otorga esos derechos: GRANT SEND ON SERVICE::SqlQueryNotificationService TO username.

Nota: Hay un determinado número de restricciones en la sintaxis de las consultas SQL para soportar notificaciones. Para obtener la lista completa de restricciones, acudid al punto "Crear una consulta SQL para notificaciones" en los libros en linea de SQL Server 2005. Tambien, si nos encontramos con consultas que no son guardades en la cache y son ejecutadas en cada petición de la página, es probable que o bien no cumplan con las restricciones requeridas por SQL Server 2005 o bien que SQL Server 2005 esté generando un error cuando intenta establecer las notificaciones para esas consultas. Actualmente, estas situaciones no producen ningun mensaje de error con el resultado final de que las dependencias de la caché son siempre no válidas y, por tanto, cualquier consulta asociada se ejecuta siempre con cada petición de página