Almacenamiento en memoria caché

de Microsoft

Una comprensión del almacenamiento en caché es importante para una aplicación ASP.NET de buen rendimiento. En ASP.NET 1.x se ofrecen tres opciones diferentes para el almacenamiento en caché; almacenamiento en caché de salida, almacenamiento en caché de fragmentos y la API de caché.

Una comprensión del almacenamiento en caché es importante para una aplicación ASP.NET de buen rendimiento. En ASP.NET 1.x se ofrecen tres opciones diferentes para el almacenamiento en caché; almacenamiento en caché de salida, almacenamiento en caché de fragmentos y la API de caché. ASP.NET 2.0 ofrece los tres métodos, pero agrega algunas características adicionales importantes. Ahora hay varias dependencias de caché nuevas y los desarrolladores también tienen la opción de crear dependencias de caché personalizadas. La configuración del almacenamiento en caché también se ha mejorado significativamente en ASP.NET 2.0.

Nuevas características

Perfiles de caché

Los perfiles de caché permiten a los desarrolladores definir una configuración de caché específica que se puede aplicar a páginas individuales. Por ejemplo, si tiene algunas páginas que deben expirar de la caché después de 12 horas, puede crear fácilmente un perfil de caché que se pueda aplicar a esas páginas. Para agregar un nuevo perfil de caché, use la sección <outputCacheSettings> del archivo de configuración. Por ejemplo, a continuación se muestra la configuración de un perfil de caché denominado twoday que configura una duración de caché de 12 horas.

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

Para aplicar este perfil de caché a una página determinada, use el atributo CacheProfile de la directiva @OutputCache, como se muestra a continuación:

<%@ OutputCache CacheProfile="TwoDay" %>

Dependencias de caché personalizadas

En ASP.NET 1.x, los desarrolladores reclamaban dependencias de caché personalizadas. En ASP.NET 1.x, la clase CacheDependency estaba sellada, lo que impedía a los desarrolladores derivar clases propias de ella. En ASP.NET 2.0, se ha quitado esa limitación y los desarrolladores pueden desarrollar dependencias de caché personalizadas propias. La clase CacheDependency permite la creación de una dependencia de caché personalizada basada en archivos, directorios o claves de caché.

Por ejemplo, en el código siguiente se crea una dependencia de caché personalizada basada en un archivo denominado stuff.xml ubicado en la raíz de la aplicación web:

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

En este escenario, cuando cambia el archivo stuff.xml, el elemento almacenado en caché se invalida.

También es posible crear una dependencia de caché personalizada mediante claves de caché. Con este método, la eliminación de la clave de caché invalidará los datos almacenados en caché. Esto se ilustra en el ejemplo siguiente:

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

Para invalidar el elemento insertado antes, basta con quitar el elemento que se ha insertado en la caché para actuar como clave de caché.

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

Tenga en cuenta que la clave del elemento que actúa como clave de caché debe ser la misma que el valor agregado a la matriz de claves de caché.

Dependencias de caché de SQL basadas en sondeo (también denominadas dependencias basadas en tablas)

En SQL Server 7 y 2000 se usa el modelo basado en sondeo para las dependencias de caché de SQL. El modelo basado en sondeo usa un desencadenador en una tabla de base de datos que se desencadena cuando cambian los datos de la tabla. Ese desencadenador actualiza un campo changeId en la tabla de notificaciones que ASP.NET comprueba periódicamente. Si el campo changeId se ha actualizado, ASP.NET sabe que los datos han cambiado y invalida los datos almacenados en caché.

Nota:

SQL Server 2005 también puede usar el modelo basado en sondeo, pero como no es el modelo más eficaz, es aconsejable usar uno basado en consultas (descrito más adelante) con SQL Server 2005.

Para que una dependencia de caché de SQL que usa el modelo basado en sondeo funcione correctamente, las tablas deben tener habilitadas las notificaciones. Esto se puede lograr mediante programación con la clase SqlCacheDependencyAdmin, o bien mediante la utilidad aspnet_regsql.exe.

La siguiente línea de comandos registra la tabla Products en la base de datos Northwind ubicada en una instancia de SQL Server denominada dbase para la dependencia de caché de SQL.

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

A continuación se muestra una explicación de los modificadores de línea de comandos usados en el comando anterior:

Modificador de la línea de comandos Propósito
-S server Especifica el nombre del servidor.
-ed Especifica que la base de datos debe estar habilitada para la dependencia de caché de SQL.
-d database_name Especifica el nombre de la base de datos que debe estar habilitada para la dependencia de caché de SQL.
-E Especifica que aspnet_regsql debe usar la autenticación de Windows al conectarse a la base de datos.
-et Especifica que se va a habilitar una tabla de base de datos para la dependencia de caché de SQL.
-t nombre_de_tabla Especifica el nombre de la tabla de base de datos que se va a habilitar para la dependencia de caché de SQL.

Nota:

Hay otros modificadores disponibles para aspnet_regsql.exe. Para obtener una lista completa, ejecute aspnet_regsql.exe -? desde una línea de comandos.

Cuando se ejecuta este comando, se realizan los siguientes cambios en la base de datos de SQL Server:

  • Se agrega una tabla AspNet_SqlCacheTablesForChangeNotification. Esta tabla contiene una fila para cada tabla de la base de datos para la que se ha habilitado una dependencia de caché de SQL.
  • Los procedimientos almacenados siguientes se crean dentro de la base de datos:
AspNet_SqlCachePollingStoredProcedure Consulta la tabla AspNet_SqlCacheTablesForChangeNotification y devuelve todas las tablas que están habilitadas para la dependencia de caché de SQL y el valor de changeId para cada tabla. Este procedimiento almacenado se usa para sondear y determinar si los datos han cambiado.
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure Devuelve todas las tablas habilitadas para la dependencia de caché de SQL mediante la consulta de la tabla AspNet_SqlCacheTablesForChangeNotification y devuelve todas las tablas habilitadas para la dependencia de caché de SQL.
AspNet_SqlCacheRegisterTableStoredProcedure Registra una tabla para la dependencia de caché de SQL mediante la adición de la entrada necesaria en la tabla de notificaciones y agrega el desencadenador.
AspNet_SqlCacheUnRegisterTableStoredProcedure Anula el registro de una tabla para la dependencia de caché de SQL mediante la eliminación de la entrada de la tabla de notificaciones y quita el desencadenador.
AspNet_SqlCacheUpdateChangeIdStoredProcedure Actualiza la tabla de notificaciones mediante el incremento del valor changeId de la tabla modificada. ASP.NET usa este valor para determinar si los datos han cambiado. Como se indica a continuación, el desencadenador crea este procedimiento almacenado cuando la tabla está habilitada.
  • Se crea un desencadenador de SQL Server denominado nombre_de_tabla_AspNet_SqlCacheNotification_Trigger para la tabla. Este desencadenador ejecuta AspNet_SqlCacheUpdateChangeIdStoredProcedure cuando se realiza una operación INSERT, UPDATE o DELETE en la tabla.
  • Se agrega un rol de SQL Server denominado aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess a la base de datos.

El rol de SQL Server aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess tiene permisos EXEC para AspNet_SqlCachePollingStoredProcedure. Para que el modelo de sondeo funcione correctamente, debe agregar la cuenta de proceso al rol aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess. La herramienta aspnet_regsql.exe no lo hará de forma automática.

Configuración de dependencias de caché de SQL basadas en sondeo

Hay varios pasos necesarios para configurar las dependencias de caché de SQL basadas en sondeo. El primer paso consiste en habilitar la base de datos y la tabla como se ha descrito antes. Una vez que se completa ese paso, el resto de la configuración es el siguiente:

  • Configuración del archivo de configuración de ASP.NET.
  • Configuración de SqlCacheDependency

Configuración del archivo de configuración de ASP.NET

Además de agregar un cadena de conexión como se describe en un módulo anterior, también debe configurar un elemento <cache> con un elemento <sqlCacheDependency>, como se muestra a continuación:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

Esta configuración habilita una dependencia de caché de SQL en la base de datos pubs. Tenga en cuenta que el atributo pollTime del elemento <sqlCacheDependency> tiene como valor predeterminado 60 000 milisegundos o 1 minuto. (Este valor no puede ser inferior a 500 milisegundos). En este ejemplo, el elemento <add> agrega una nueva base de datos e invalida pollTime y lo establece en 9 000 000 milisegundos.

Configuración de SqlCacheDependency

El siguiente paso consiste en configurar SqlCacheDependency. La manera más fácil de lograrlo es especificar el valor del atributo SqlDependency en la directiva @Outcache de la siguiente manera:

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

En la directiva @OutputCache anterior, se configura una dependencia de caché de SQL para la tabla authors de la base de datos pubs. Se pueden configurar varias dependencias si se separan con un punto y coma, de forma que:

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

Otro método de configuración de SqlCacheDependency es hacerlo mediante programación. En el código siguiente se crea una dependencia de caché de SQL en la tabla authors de la base de datos pubs.

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

Una de las ventajas de definir mediante programación la dependencia de caché de SQL es que puede controlar las excepciones que se puedan producir. Por ejemplo, si intenta definir una dependencia de caché de SQL para una base de datos que no se ha habilitado para la notificación, se iniciará una excepción DatabaseNotEnabledForNotificationException. En ese caso, puede intentar habilitar la base de datos para las notificaciones mediante la llamada al método SqlCacheDependencyAdmin.EnableNotifications y pasar el nombre de la base de datos.

Del mismo modo, si intenta definir una dependencia de caché de SQL para una tabla que no se ha habilitado para la notificación, se iniciará una excepción TableNotEnabledForNotificationException. Después, puede llamar al método SqlCacheDependencyAdmin.EnableTableForNotifications y pasarle el nombre de la base de datos y el de la tabla.

En el ejemplo de código siguiente se muestra cómo configurar correctamente el control de excepciones al configurar una dependencia de caché de SQL.

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

Más información: https://msdn.microsoft.com/library/t9x04ed2.aspx

Dependencias de caché de SQL basadas en consultas (solo para SQL Server 2005)

Cuando se usa SQL Server 2005 para la dependencia de caché de SQL, el modelo basado en sondeo no es necesario. Cuando se usan con SQL Server 2005, las dependencias de caché de SQL se comunican directamente mediante conexiones SQL a la instancia de SQL Server (no es necesaria ninguna configuración adicional) mediante notificaciones de consulta de SQL Server 2005.

La manera más sencilla de habilitar la notificación basada en consultas consiste en hacerlo mediante declaración y establecer el atributo SqlCacheDependency del objeto de origen de datos en CommandNotification y el atributo EnableCaching en true. Con este método, no se necesita ningún código. Si el resultado de un comando ejecutado en el origen de datos cambia, invalidará los datos en caché.

En el ejemplo siguiente se configura un control de origen de datos para la dependencia de caché de SQL:

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

En este caso, si la consulta especificada en SelectCommand devuelve un resultado diferente al original, se invalidan los resultados almacenados en caché.

También puede especificar que todos los orígenes de datos estén habilitados para las dependencias de caché de SQL si establece el atributo SqlDependency de la directiva @OutputCache en CommandNotification. Esto se muestra en el ejemplo siguiente.

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

Nota:

Para más información sobre las notificaciones de consulta en SQL Server 2005, vea los Libros en pantalla de SQL Server.

Otro método para configurar una dependencia de caché de SQL basada en consultas consiste en hacerlo mediante programación mediante la clase SqlCacheDependency. En el ejemplo de código siguiente se muestra cómo se logra.

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

Más información: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

Sustitución posterior a la caché

El almacenamiento en caché de una página puede aumentar drásticamente el rendimiento de una aplicación web. Pero en algunos casos necesita que la mayoría de la página se almacene en caché y algunos fragmentos de la página sean dinámicos. Por ejemplo, si crea una página de noticias que es completamente estática durante períodos de tiempo establecidos, puede establecer que toda la página se almacene en caché. Si quiere incluir un banner de anuncio giratorio que cambie en cada solicitud de página, la parte de la página que contiene el anuncio debe ser dinámica. Para permitirle almacenar en caché una página, pero sustituir dinámicamente parte del contenido, puede usar la sustitución posterior a la caché de ASP.NET. Con la sustitución posterior a la caché, toda la página se almacena en caché con partes específicas marcadas como exentas del almacenamiento en caché. En el ejemplo de los banners de anuncios, el control AdRotator permite aprovechar la sustitución posterior a la caché a fin de que los anuncios se creen dinámicamente para cada usuario y para cada actualización de página.

Hay tres maneras de implementar la sustitución posterior a la caché:

  • Mediante declaración, con el control Sustitución.
  • Mediante programación, con la API de control de sustitución.
  • Implícitamente, mediante el control AdRotator.

Control Sustitución

El control de sustitución de ASP.NET especifica una sección de una página almacenada en caché que se crea dinámicamente en lugar de almacenarla en caché. Un control de sustitución se coloca en la ubicación de la página donde quiere que aparezca el contenido dinámico. En tiempo de ejecución, el control de sustitución llama a un método que se especifica con la propiedad MethodName. El método debe devolver una cadena, que luego reemplaza el contenido del control de sustitución. Debe ser un método estático en el control Page o UserControl contenedor. El uso del control de sustitución hace que se cambie la capacidad de caché del lado cliente a la caché del servidor, de modo que la página no se almacene en caché en el cliente. Esto garantiza que las solicitudes futuras a la página vuelvan a llamar al método para generar contenido dinámico.

API de sustitución

A fin de crear contenido dinámico para una página almacenada en caché mediante programación, puede llamar al método WriteSubstitution en el código de la página y pasarle el nombre de un método como parámetro. El método que controla la creación del contenido dinámico toma un único parámetro HttpContext y devuelve una cadena. La cadena de devolución es el contenido que se sustituirá en la ubicación especificada. Una ventaja de llamar al método WriteSubstitution en lugar de usar el control de sustitución mediante declaración es que puede llamar a un método de cualquier objeto arbitrario en lugar de a un método estático del objeto Page o UserControl.

Al llamar al método WriteSubstitution, se cambia la capacidad de caché del lado cliente a la caché del servidor, de modo que la página no se almacene en caché en el cliente. Esto garantiza que las solicitudes futuras a la página vuelvan a llamar al método para generar contenido dinámico.

Control AdRotator

El control de servidor AdRotator implementa compatibilidad con la sustitución posterior a la caché de manera interna. Si coloca un control AdRotator en la página, representará anuncios únicos en cada solicitud, independientemente de si la página principal está almacenada en caché. Como resultado, una página que incluye un control AdRotator solo se almacena en caché en el lado servidor.

ControlCachePolicy (clase)

La clase ControlCachePolicy permite el control mediante programación del almacenamiento en caché de fragmentos mediante controles de usuario. ASP.NET inserta controles de usuario dentro de una instancia de BasePartialCachingControl. La clase BasePartialCachingControl representa un control de usuario que tiene habilitado el almacenamiento en caché de salida.

Al acceder a la propiedad BasePartialCachingControl.CachePolicy de un control PartialCachingControl, siempre recibirá un objeto ControlCachePolicy válido. Pero si accede a la propiedad UserControl.CachePolicy de un control UserControl, recibirá un objeto ControlCachePolicy válido solo si el control de usuario ya lo encapsula un control BasePartialCachingControl. Si no está encapsulado, el objeto ControlCachePolicy devuelto por la propiedad iniciará excepciones al intentar manipularlo porque no tiene asociada una instancia de BasePartialCachingControl. Para determinar si una instancia de UserControl admite el almacenamiento en caché sin generar excepciones, inspeccione la propiedad SupportsCaching.

El uso de la clase ControlCachePolicy es una de las varias maneras de habilitar el almacenamiento en caché de salida. En la lista siguiente se describen los métodos que puede usar para habilitar el almacenamiento en caché de salida:

  • Use la directiva @ OutputCache para habilitar el almacenamiento en caché de salida en escenarios declarativos.
  • Use el atributo PartialCachingAttribute para habilitar el almacenamiento en caché de un control de usuario en un archivo de código subyacente.
  • Use la clase ControlCachePolicy para especificar la configuración de caché en escenarios mediante programación en los que trabaje con instancias de BasePartialCachingControl habilitadas para caché mediante uno de los métodos anteriores y realice la carga dinámica mediante el método System.Web.UI.TemplateControl.LoadControl.

Una instancia de ControlCachePolicy solo se puede manipular correctamente entre las fases Init y PreRender del ciclo de vida del control. Si modifica un objeto ControlCachePolicy después de la fase PreRender, ASP.NET inicia una excepción, porque los cambios realizados después de representar el control no pueden afectar realmente a la configuración de caché (un control se almacena en caché durante la fase de representación). Por último, una instancia de control de usuario (y, por tanto, su objeto ControlCachePolicy) solo está disponible para la manipulación mediante programación cuando se representa realmente.

Cambios en la configuración del almacenamiento en caché: el elemento <caching>

En ASP.NET 2.0 hay varios cambios en la configuración del almacenamiento en caché. El elemento <caching> es una novedad de ASP.NET 2.0 y permite realizar cambios de configuración de almacenamiento en caché en el archivo de configuración. Los atributos siguientes están disponibles.

Element Descripción
cache Elemento opcional. Define la configuración global de la caché de aplicaciones.
outputCache Elemento opcional. Especifica la configuración de caché de salida de toda la aplicación.
outputCacheSettings Elemento opcional. Especifica la configuración de caché de salida que se puede aplicar a las páginas de la aplicación.
sqlCacheDependency Elemento opcional. Configura las dependencias de caché de SQL para una aplicación ASP.NET.

El elemento <cache>

Los atributos siguientes están disponibles en el elemento <cache>:

Atributo Descripción
disableMemoryCollection Atributo Boolean opcional. Obtiene o establece un valor que indica si la colección de memoria caché que se produce cuando la máquina está bajo presión de memoria está deshabilitada.
disableExpiration Atributo Boolean opcional. Obtiene o establece un valor que indica si la expiración de la memoria caché está deshabilitada. Cuando se deshabilita, los elementos almacenados en caché no expiran y no se produce la limpieza en segundo plano de los elementos en caché expirados.
privateBytesLimit Atributo Int64 opcional. Obtiene o establece un valor que indica el tamaño máximo de los bytes privados de una aplicación antes de que la caché empiece a vaciar los elementos expirados e intente reclamar memoria. Este límite incluye tanto la memoria usada por la caché como la sobrecarga de memoria normal de la aplicación en ejecución. Un valor de cero indica que ASP.NET usará su propia heurística para determinar cuándo empezar a reclamar memoria.
percentagePhysicalMemoryUsedLimit Atributo Int32 opcional. Obtiene o establece un valor que indica el porcentaje máximo de memoria física de una máquina que puede consumir una aplicación antes de que la caché empiece a vaciar los elementos expirados e intente reclamar memoria. Este uso de memoria incluye tanto la memoria usada por la caché como el uso de memoria normal de la aplicación en ejecución. Un valor de cero indica que ASP.NET usará su propia heurística para determinar cuándo empezar a reclamar memoria.
privateBytesPollTime Atributo TimeSpan opcional. Obtiene o establece un valor que indica el intervalo de tiempo entre el sondeo para el uso de memoria de bytes privados de la aplicación.

Elemento <outputCache>

Los atributos siguientes están disponibles para el elemento <outputCache>.

Atributo Descripción
enableOutputCache Atributo Boolean opcional. Habilita o deshabilita la caché de salida de la página. Si se deshabilita, no se almacenan páginas en caché, independientemente de la configuración mediante declaración o programación. El valor predeterminado es true.
enableFragmentCache Atributo Boolean opcional. Habilita o deshabilita la caché de fragmentos de aplicación. Si se deshabilita, no se almacena en caché ninguna página, independientemente de la directiva @OutputCache o del perfil de almacenamiento en caché que se use. Incluye un encabezado de control de caché que indica que los servidores proxy ascendentes, así como los clientes del explorador no deben intentar almacenar en caché la salida de la página. El valor predeterminado es Falso.
sendCacheControlHeader Atributo Boolean opcional. Obtiene o establece un valor que indica si el módulo de caché de salida envía de forma predeterminada el encabezado cache-control:private. El valor predeterminado es Falso.
omitVaryStar Atributo Boolean opcional. Habilita o deshabilita el envío de un encabezado "Vary: </strong>" de Http en la respuesta. Con el valor predeterminado de false, se envía un encabezado "*Vary: *" para las páginas almacenadas en caché de salida. Cuando se envía el encabezado Vary, permite almacenar en caché diferentes versiones en función de lo especificado en el encabezado Vary. Por ejemplo, Vary:User-Agents almacenará versiones diferentes de una página en función del agente de usuario que emita la solicitud. El valor predeterminado es **false.

Elemento <outputCacheSettings>

El elemento <outputCacheSettings> permite la creación de perfiles de caché como se ha descrito antes. El único elemento secundario de <outputCacheSettings> es el elemento <outputCacheProfiles> para configurar perfiles de caché.

Elemento <sqlCacheDependency>

Los atributos siguientes están disponibles para el elemento <sqlCacheDependency>.

Atributo Descripción
enabled Atributo booleano obligatorio. Indica si se sondean o no los cambios.
pollTime Atributo Int32 opcional. Establece la frecuencia con la que SqlCacheDependency sondea la tabla de base de datos para ver los cambios. Este valor se corresponde al número de milisegundos entre sondeos sucesivos. No se puede establecer en menos de 500 milisegundos. El valor predeterminado es de 1 minuto.

Más información

Hay información adicional que debe tener en cuenta con respecto a la configuración de la caché.

  • Si no se establece el límite de bytes privados del proceso de trabajo, la caché usará uno de los límites siguientes:

    • x86 2GB: 800 MB o 60 % de RAM física, lo que sea menor
    • x86 3GB: 1800 MB o 60 % de RAM física, lo que sea menor
    • x64: 1 terabyte o 60 % de RAM física, lo que sea menor
  • Si se establecen el límite de bytes privados del proceso de trabajo y <cache privateBytesLimit/>, la caché usará el mínimo de los dos.

  • Al igual que en la versión 1.x, se quitan las entradas de caché y se llama a GC.Collect por dos motivos:

    • El límite de bytes privados está muy cerca
    • La memoria disponible está cerca del 10 % o menos
  • Puede deshabilitar eficazmente el recorte y la caché en condiciones de memoria disponible bajas si establece <cache percentagePhysicalMemoryUseLimit/> en 100.

  • A diferencia de la versión 1.x, en la versión 2.0 se suspenderá el recorte y se recopilarán llamadas si en la última operación GC.Collect no se han reducido los bytes privados ni el tamaño de los montones administrados en más del 1 % del límite de memoria (caché).

Laboratorio 1: Dependencias de caché personalizadas

  1. Cree un sitio web.

  2. Agregue un nuevo archivo XML denominado cache.xml y guárdelo en la raíz de la aplicación web.

  3. Agregue el código siguiente al método Page_Load en el código subyacente de default.aspx:

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. Agregue lo siguiente a la parte superior de default.aspx en la vista de origen:

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. Navegue a Default.aspx. ¿Qué indica la hora?

  6. Actualice el explorador. ¿Qué indica la hora?

  7. Abra cache.xml y agregue el siguiente código:

    <anElement></anElement>
    
  8. Guarde cache.xml.

  9. Actualice el explorador. ¿Qué indica la hora?

  10. Explique por qué se ha actualizado la hora en lugar de mostrarse los valores almacenados en caché anteriormente:

Laboratorio 2: Uso de dependencias de caché basadas en sondeo

En este laboratorio se usa el proyecto que ha creado en el módulo anterior que permite editar datos en la base de datos Northwind mediante un control GridView y DetailsView.

  1. Abra el proyecto en Visual Studio 2005.

  2. Ejecute la utilidad aspnet_regsql en la base de datos Northwind para habilitar la base de datos y la tabla Products. Use el comando siguiente desde un símbolo del sistema de Visual Studio:

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. Agregue lo siguiente al archivo web.config:

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. Agregue un nuevo formulario web denominado showdata.aspx.

  5. Agregue la siguiente directiva @outputcache a la página showdata.aspx:

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. Agregue el código siguiente a Page_Load de showdata.aspx:

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. Agregue un nuevo control SqlDataSource a showdata.aspx y configúrelo para usar la conexión de base de datos Northwind. Haga clic en Next.

  8. Active las casillas ProductName y ProductID, y haga clic en Siguiente.

  9. Haga clic en Finalizar

  10. Agregue un nuevo control GridView a la página showdata.aspx.

  11. Elija SqlDataSource1 en la lista desplegable.

  12. Guarde y vaya a showdata.aspx. Anote la hora que se muestra.