Almacenar datos en caché con ObjectDataSource (C#)

por Scott Mitchell

Descargar PDF

El almacenamiento en caché puede significar la diferencia entre una aplicación web lenta y rápida. Este tutorial es el primero de cuatro que examinan el almacenamiento en caché en ASP.NET. Obtenga información sobre los conceptos clave del almacenamiento en caché y cómo aplicar el almacenamiento en caché a la capa de presentación a través del control ObjectDataSource.

Introducción

En informática, almacenamiento en caché es el proceso de tomar datos o información que resulta costoso obtener y almacenar una copia de ella en una ubicación a la que se accede más rápido. En el caso de las aplicaciones controladas por datos, las consultas grandes y complejas suelen consumir la mayoría del tiempo de ejecución de la aplicación. Este rendimiento de una aplicación, a menudo, se puede mejorar almacenando los resultados de las consultas de base de datos costosas en la memoria de la aplicación.

ASP.NET 2.0 ofrece una variedad de opciones de almacenamiento en caché. Se puede almacenar en caché toda una página web o un marcado representado de Control de usuario a través de almacenamiento en caché de salida. Los controles ObjectDataSource y SqlDataSource también proporcionan funcionalidades de almacenamiento en caché, lo que permite almacenar los datos en caché en el nivel de control. Y ASP.NET caché de datos proporciona una API de almacenamiento en caché enriquecida que permite a los desarrolladores de páginas almacenar en caché objetos mediante programación. En este tutorial y los tres siguientes examinaremos el uso de las características de almacenamiento en caché de ObjectDataSource, así como la caché de datos. También exploraremos cómo almacenar en caché los datos en todo el inicio de la aplicación y cómo mantener actualizados los datos almacenados en caché mediante el uso de dependencias de caché de SQL. Estos tutoriales no exploran el almacenamiento en caché de salida. Para obtener un vistazo detallado al almacenamiento en caché de salida, consulte Almacenamiento en caché de salida en ASP.NET 2.0.

El almacenamiento en caché se puede aplicar en cualquier lugar de la arquitectura, desde la capa de acceso a datos hasta la capa de presentación. En este tutorial veremos cómo aplicar el almacenamiento en caché a la capa de presentación a través del control ObjectDataSource. En el siguiente tutorial examinaremos los datos de almacenamiento en caché en la capa de lógica de negocios.

Conceptos de almacenamiento en caché de claves

El almacenamiento en caché puede mejorar considerablemente el rendimiento general y la escalabilidad de una aplicación tomando datos que son costosos de generar y almacenar una copia de ella en una ubicación a la que se puede acceder de forma más eficaz. Dado que la memoria caché contiene solo una copia de los datos reales subyacentes, puede quedar obsoleta, si los datos subyacentes cambian. Para combatir esto, un desarrollador de páginas puede indicar criterios por los que el elemento de caché se expulsará de la memoria caché, utilizando cualquiera de las siguientes opciones:

  • Los criterios basados en el tiempo que un elemento se puede agregar a la memoria caché durante una duración absoluta o deslizante. Por ejemplo, un desarrollador de páginas puede indicar una duración de, por ejemplo, 60 segundos. Con una duración absoluta, el elemento almacenado en caché se expulsa 60 segundos después de agregarlo a la memoria caché, independientemente de la frecuencia con la que se obtuvo acceso. Con una duración deslizante, el elemento almacenado en caché se expulsa 60 segundos después del último acceso.
  • Criterios basados en dependencias una dependencia se puede asociar a un elemento cuando se agrega a la memoria caché. Cuando cambia la dependencia del elemento, se expulsa de la memoria caché. La dependencia puede ser un archivo, otro elemento de caché o una combinación de los dos. ASP.NET 2.0 también permite las dependencias de la caché de SQL, que permiten a los desarrolladores agregar un elemento a la memoria caché y expulsarlos cuando cambian los datos de la base de datos subyacentes. Examinaremos las dependencias de la caché de SQL en el próximo tutorial de Uso de dependencias de caché de SQL.

Independientemente de los criterios de expulsión especificados, es posible que un elemento de la memoria caché sea limpiado antes de que se cumplan los criterios basados en el tiempo o de dependencia. Si la memoria caché ha alcanzado su capacidad, se deben quitar los elementos existentes antes de que se puedan agregar nuevos. Por lo tanto, cuando se trabaja mediante programación con datos almacenados en caché, es fundamental que siempre suponga que los datos almacenados en caché no pueden estar presentes. Veremos el patrón que se va a usar al acceder a los datos desde la memoria caché mediante programación en nuestro siguiente tutorial, almacenamiento en caché de datos en la arquitectura.

El almacenamiento en caché proporciona un medio económico para apretar más rendimiento desde una aplicación. Como Steven Smith articula en su artículo ASP.NET Almacenamiento en caché: Técnicas y procedimientos recomendados:

El almacenamiento en caché puede ser una buena manera de obtener un buen rendimiento sin necesidad de mucho tiempo y análisis. La memoria es barata, por lo que si puede obtener el rendimiento que necesita almacenando en caché la salida durante 30 segundos en lugar de pasar un día o una semana intentando optimizar el código o la base de datos, realice la solución de almacenamiento en caché (suponiendo que los datos antiguos de 30 segundos sean correctos) y continúe. Finalmente, el diseño deficiente probablemente se pondrá al día, por lo que, por supuesto, debe intentar diseñar las aplicaciones correctamente. Pero si solo necesita obtener un buen rendimiento hoy en día, el almacenamiento en caché puede ser un excelente [enfoque], comprarle tiempo para re-factorizar la aplicación en una fecha posterior cuando tenga el momento de hacerlo.

Aunque el almacenamiento en caché puede proporcionar mejoras de rendimiento apreciables, no es aplicable en todas las situaciones, como con aplicaciones que usan datos en tiempo real, actualizando con frecuencia o donde incluso los datos obsoletos de corta duración son inaceptables. Pero para la mayoría de las aplicaciones, se debe usar el almacenamiento en caché. Para obtener más información sobre el almacenamiento en caché en ASP.NET 2.0, consulte la sección Almacenamiento en caché de para rendimiento de la ASP.NET 2.0 Tutoriales de inicio rápido.

Paso 1: Crear las páginas web de almacenamiento en caché

Antes de comenzar nuestra exploración de las características de almacenamiento en caché de ObjectDataSource, primero dediquemos un momento a crear las páginas de ASP.NET en nuestro proyecto de sitio web que necesitaremos para este tutorial y los tres siguientes. Empiece agregando una nueva carpeta denominada Caching. Después, agregue las siguientes páginas ASP.NET a esa carpeta, asegurándose de asociar cada página a la página maestra Site.master:

  • Default.aspx
  • ObjectDataSource.aspx
  • FromTheArchitecture.aspx
  • AtApplicationStartup.aspx
  • SqlCacheDependencies.aspx

Add the ASP.NET Pages for the Caching-Related Tutorials

Figura 1: Agregar las páginas de ASP.NET para los tutoriales relacionados con almacenamiento en caché

Igual que en las otras carpetas, Default.aspx en la carpeta Caching enumerará los tutoriales en su sección. Recuerde que el control de usuario SectionLevelTutorialListing.ascx proporciona esta funcionalidad. Por lo tanto, agregue este control de usuario a Default.aspx arrastrándolo desde el Explorador de soluciones a la vista Diseño de la página.

Figure 2: Add the SectionLevelTutorialListing.ascx User Control to Default.aspx

Figura 2: Agregue el control de usuario SectionLevelTutorialListing.ascx a Default.aspx (Haga clic aquí para ver la imagen a tamaño completo)

Por último, agregue las siguientes páginas como entradas al archivo Web.sitemap. En concreto, agregue el marcado siguiente después de Trabajar con datos binarios <siteMapNode>:

<siteMapNode title="Caching" url="~/Caching/Default.aspx" 
    description="Learn how to use the caching features of ASP.NET 2.0.">
    <siteMapNode url="~/Caching/ObjectDataSource.aspx" 
        title="ObjectDataSource Caching" 
        description="Explore how to cache data directly from the 
            ObjectDataSource control." />
    <siteMapNode url="~/Caching/FromTheArchitecture.aspx" 
        title="Caching in the Architecture" 
        description="See how to cache data from within the 
            architecture." />
    <siteMapNode url="~/Caching/AtApplicationStartup.aspx" 
        title="Caching Data at Application Startup" 
        description="Learn how to cache expensive or infrequently-changing 
            queries at the start of the application." />
    <siteMapNode url="~/Caching/SqlCacheDependencies.aspx" 
        title="Using SQL Cache Dependencies" 
        description="Examine how to have data automatically expire from the 
            cache when its underlying database data is modified." />
</siteMapNode>

Después de actualizar Web.sitemap, dedique un momento a ver el sitio web de tutoriales a través de un explorador. El menú de la izquierda ahora incluye elementos para los tutoriales de almacenamiento en caché.

The Site Map Now Includes Entries for the Caching Tutorials

Figura 3: El mapa del sitio ahora incluye entradas para los tutoriales de almacenamiento en caché

Paso 2: Mostrar una lista de productos en una página web

En este tutorial se explora cómo usar las características integradas de almacenamiento en caché del control ObjectDataSource. Sin embargo, para poder examinar estas características, primero necesitamos una página para trabajar. Vamos a crear una página web que use GridView para enumerar la información del producto recuperada por un ObjectDataSource de la clase ProductsBLL.

Para empezar, abra la página ObjectDataSource.aspx en la carpeta Caching. Arrastre un Control GridView desde el Cuadro de herramientas al Diseñador, establezca su propiedad ID en Productsy, desde su etiqueta inteligente, elija enlazarla a un nuevo control ObjectDataSource denominado ProductsDataSource. Configure ObjectDataSource para que funcione con la clase ProductsBLL.

Configure the ObjectDataSource to Use the ProductsBLL Class

Figura 4: Configure ObjectDataSource para usar la clase ProductsBLL (Haga clic aquí para ver la imagen a tamaño completo)

En esta página, vamos a crear una GridView editable para que podamos examinar lo que sucede cuando los datos almacenados en caché en ObjectDataSource se modifican a través de la interfaz de GridView. Deje la lista desplegable en la pestaña SELECT establecida en su valor predeterminado, GetProducts(), pero cambie el elemento seleccionado en la pestaña UPDATE a la sobrecarga de UpdateProduct que acepta productName, unitPricey productID como parámetros de entrada.

Set the UPDATE Tab s Drop-Down List to the Appropriate UpdateProduct Overload

Figura 5: Establezca la lista desplegable de la pestaña UPDATE en la sobrecarga UpdateProduct adecuada (Haga clic para ver la imagen a tamaño completo)

Por último, establezca las listas desplegables en las pestañas INSERT y DELETE en (Ninguno) y haga clic en Finalizar. Al completar el Asistente para configurar orígenes de datos, Visual Studio establece la propiedad OldValuesParameterFormatString ObjectDataSource en original_{0}. Como se describe en el tutorial de Introducción a la inserción, actualización y eliminación de datos, esta propiedad debe quitarse de la sintaxis declarativa o volver a establecerse en su valor predeterminado, {0}, para que el flujo de trabajo de actualización continúe sin errores.

Además, al finalizar el asistente, Visual Studio agrega un campo a GridView para cada uno de los campos de datos del producto. Quite todos los campos excepto los BoundFields ProductName, CategoryName y UnitPrice. A continuación, actualice las propiedades HeaderText de cada uno de estos BoundFields a Product, Category y Price, respectivamente. Dado que el campo de ProductName es obligatorio, convierta BoundField en templateField y agregue requiredFieldValidator al EditItemTemplate. Del mismo modo, convierta el UnitPrice BoundField en templateField y agregue un CompareValidator para asegurarse de que el valor especificado por el usuario es un valor de moneda válido mayor o igual que cero. Además de estas modificaciones, no dude en realizar cambios estéticos, como alinear a la derecha el valor UnitPrice, o especificar el formato del texto UnitPrice en sus interfaces de solo lectura y edición.

Haga que GridView se pueda editar activando la casilla Habilitar edición en la etiqueta inteligente GridView. Active también las casillas Habilitar paginación y Habilitar ordenación.

Nota:

¿Necesita una revisión de cómo personalizar la interfaz de edición de GridView? Si es así, consulte el tutorial Personalización de la interfaz de modificación de datos .

Enable GridView Support for Editing, Sorting, and Paging

Figura 6: Habilite la compatibilidad con GridView para editar, ordenar y paginar (Haga clic para ver la imagen a tamaño completo)

Después de realizar estas modificaciones en GridView, el marcado declarativo de GridView y ObjectDataSource debe ser similar al siguiente:

<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource" 
    AllowPaging="True" AllowSorting="True">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:TemplateField HeaderText="Product" SortExpression="ProductName">
            <EditItemTemplate>
                <asp:TextBox ID="ProductName" runat="server" 
                    Text='<%# Bind("ProductName") %>'></asp:TextBox>
                <asp:RequiredFieldValidator 
                    ID="RequiredFieldValidator1" Display="Dynamic" 
                    ControlToValidate="ProductName" SetFocusOnError="True"
                    ErrorMessage="You must provide a name for the product."
                    runat="server">*</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" 
                    Text='<%# Bind("ProductName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            ReadOnly="True" SortExpression="CategoryName" />
        <asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
            <EditItemTemplate>
                $<asp:TextBox ID="UnitPrice" runat="server" Columns="8" 
                    Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
                <asp:CompareValidator ID="CompareValidator1"
                    ControlToValidate="UnitPrice" Display="Dynamic" 
                    ErrorMessage="You must enter a valid currency value with no 
                        currency symbols. Also, the value must be greater than 
                        or equal to zero."
                    Operator="GreaterThanEqual" SetFocusOnError="True" 
                    Type="Currency" runat="server" 
                    ValueToCompare="0">*</asp:CompareValidator>
            </EditItemTemplate>
            <ItemStyle HorizontalAlign="Right" />
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" 
                    Text='<%# Bind("UnitPrice", "{0:c}") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="{0}" SelectMethod="GetProducts" 
    TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Como se muestra en la figura 7, GridView editable enumera el nombre, la categoría y el precio de cada uno de los productos de la base de datos. Dedique un momento a probar la funcionalidad de la página para ordenar los resultados, paginarlos y editar un registro.

Each Product s Name, Category, and Price is Listed in a Sortable, Pageable, Editable GridView

Figura 7: Cada nombre, categoría y precio de cada producto aparece en un control GridView Ordenable, Paginable y Editable (Haga clic para ver la imagen a tamaño completo)

Paso 3: Examinar cuándo ObjectDataSource solicita datos

El Products GridView recupera sus datos que se van a mostrar invocando el método Select del ProductsDataSource ObjectDataSource. Este objectDataSource crea una instancia de la clase ProductsBLL de la capa lógica de negocios y llama a su método GetProducts(), que a su vez llama al método ProductsTableAdapter de capa de acceso a datos GetProducts() . El método DAL se conecta a la base de datos Northwind y emite la consulta de SELECT configurada. A continuación, estos datos se devuelven a la DAL, que lo empaqueta en un NorthwindDataTable. El objeto DataTable se devuelve al BLL, que lo devuelve a ObjectDataSource, que lo devuelve a GridView. A continuación, GridView crea un objeto GridViewRow para cada DataRow de DataTable y cada GridViewRow se representa finalmente en el HTML que se devuelve al cliente y se muestra en el explorador del visitante.

Esta secuencia de eventos se produce cada vez que GridView necesita enlazarse a sus datos subyacentes. Esto sucede cuando la página se visita por primera vez, cuando se mueve de una página de datos a otra, al ordenar GridView, o al modificar los datos de GridView a través de su edición integrada o eliminación de interfaces. Si el estado de vista de GridView está deshabilitado, GridView también se volverá a enlazar en cada postback también. GridView también se puede volver a enlazar explícitamente a sus datos llamando a su método DataBind().

Para apreciar completamente la frecuencia con la que se recuperan los datos de la base de datos, vamos a mostrar un mensaje que indica cuándo se vuelven a recuperar los datos. Agregue un control Web label encima de GridView denominado ODSEvents. Borre su propiedad Text y establezca su propiedad EnableViewState en false. Debajo de la etiqueta, agregue un control Web Button y establezca su propiedad Text en Postback.

Add a Label and Button to the Page Above the GridView

Figura 8: Agregue una etiqueta y un botón a la página encima de GridView (Haga clic para ver la imagen a tamaño completo)

Durante el flujo de trabajo de acceso a datos, el evento de Selecting ObjectDataSource se desencadena antes de que se cree el objeto subyacente y se invoque su método configurado. Cree un controlador de eventos para este evento y agregue el siguiente código:

protected void ProductsDataSource_Selecting(object sender, 
    ObjectDataSourceSelectingEventArgs e)
{
    ODSEvents.Text = "-- Selecting event fired";
}

Cada vez que ObjectDataSource realiza una solicitud a la arquitectura de los datos, la etiqueta mostrará el texto Seleccionar evento desencadenado.

Visite esta página en un explorador. Cuando se visita la página por primera vez, se muestra el texto Seleccionar evento desencadenado. Haga clic en el botón Postback y observe que el texto desaparece (suponiendo que la propiedad EnableViewState GridView está establecida en true, el valor predeterminado). Esto se debe a que, en postback, GridView se reconstruye a partir de su estado de vista y, por lo tanto, no se convierte en ObjectDataSource para sus datos. La ordenación, paginación o edición de los datos, sin embargo, hace que GridView se vuelva a enlazar a su origen de datos y, por lo tanto, el evento Selecting desencadena el texto se vuelve a aparecer.

Whenever the GridView is Rebound to its Data Source, Selecting event fired is Displayed

Figura 9: Cada vez que GridView está rebotando en su origen de datos, se muestra el evento Selecting (Haga clic para ver la imagen de tamaño completo).

Clicking the Postback Button Causes the GridView to be Reconstructed from its View State

Figura 10: Hacer clic en el botón Postback hace que GridView se reconstruya a partir de su estado de visualización (Haga clic para ver la imagen de tamaño completo)

Puede parecer inútil recuperar los datos de la base de datos cada vez que los datos se paginan o se ordenan. Después de todo, ya que estamos usando la paginación predeterminada, ObjectDataSource ha recuperado todos los registros al mostrar la primera página. Incluso si GridView no proporciona compatibilidad con la ordenación y paginación, los datos deben recuperarse de la base de datos cada vez que cualquier usuario visite la página (y en cada postback, si el estado de vista está deshabilitado). Pero si GridView muestra los mismos datos para todos los usuarios, estas solicitudes de base de datos adicionales son superfluas. ¿Por qué no almacenar en caché los resultados devueltos desde el método GetProducts() y enlazar GridView a esos resultados almacenados en caché?

Paso 4: Almacenar en caché los datos mediante ObjectDataSource

Simplemente estableciendo algunas propiedades, ObjectDataSource se puede configurar para almacenar automáticamente en caché sus datos recuperados en la memoria caché de datos ASP.NET. En la lista siguiente se resumen las propiedades relacionadas con la memoria caché de ObjectDataSource:

  • EnableCaching debe establecerse en true para habilitar el almacenamiento en caché. El valor predeterminado es false.
  • CacheDuration la cantidad de tiempo, en segundos, que los datos se almacenan en caché. El valor predeterminado es 0. ObjectDataSource solo almacenará en caché los datos si EnableCaching es true y CacheDuration se establece en un valor mayor que cero.
  • CacheExpirationPolicy se puede establecer en Absolute o Sliding. Si Absolutees, ObjectDataSource almacena en caché sus datos recuperados durante CacheDuration segundos; si Sliding, los datos expiran solo después de que no se haya accedido durante CacheDuration segundos. El valor predeterminado es Absolute.
  • CacheKeyDependency usar esta propiedad para asociar las entradas de caché de ObjectDataSource a una dependencia de caché existente. Las entradas de datos ObjectDataSource se pueden expulsar prematuramente de la memoria caché si expiran sus CacheKeyDependencyasociadas. Esta propiedad se usa normalmente para asociar una dependencia de caché de SQL con la memoria caché de ObjectDataSource, un tema que exploraremos en el futuro Uso de dependencias de caché de SQL tutorial.

Configuremos el ProductsDataSource ObjectDataSource para almacenar en caché sus datos durante 30 segundos en una escala absoluta. Establezca la propiedad EnableCaching ObjectDataSource en true y su propiedad CacheDuration en 30. Deje la propiedad CacheExpirationPolicy establecida en su valor predeterminado, Absolute.

Configure the ObjectDataSource to Cache its Data for 30 Seconds

Figura 11: Configure ObjectDataSource para almacenar en caché sus datos durante 30 segundos (Haga clic para ver la imagen a tamaño completo)

Guarde los cambios y vuelva a visitar esta página en un explorador. El texto activado del evento Selecting aparecerá cuando visite por primera vez la página, ya que inicialmente los datos no están en la memoria caché. Pero los postbacks posteriores desencadenados al hacer clic en el botón Postback, ordenar, paginar o hacer clic en los botones Editar o Cancelar no volver a mostrar el texto desencadenado del evento Selecting. Esto se debe a que el Selecting evento solo se desencadena cuando ObjectDataSource obtiene sus datos de su objeto subyacente; el Selecting evento no se desencadena si los datos se extraen de la caché de datos.

Después de 30 segundos, los datos se expulsarán de la memoria caché. Los datos también se expulsarán de la memoria caché si se invocan los métodos ObjectDataSource Insert, Updateo Delete. Por lo tanto, después de pasar 30 segundos o se ha hecho clic en el botón Actualizar, ordenar, paginar o hacer clic en los botones Editar o Cancelar hará que ObjectDataSource obtenga sus datos de su objeto subyacente, mostrando el texto desencadenado del evento Selecting cuando se desencadena el Selecting evento. Estos resultados devueltos se vuelven a colocar en la caché de datos.

Nota:

Si ve el texto desencadenado por el evento Selecting con frecuencia, incluso cuando espera que ObjectDataSource trabaje con datos almacenados en caché, puede deberse a restricciones de memoria. Si no hay suficiente memoria libre, es posible que los datos agregados a la memoria caché por ObjectDataSource se hayan guardado. Si ObjectDataSource no parece estar almacenando en caché correctamente los datos o solo almacena en caché los datos esporádicamente, cierre algunas aplicaciones para liberar memoria e inténtelo de nuevo.

En la figura 12 se muestra el flujo de trabajo de almacenamiento en caché de ObjectDataSource. Cuando el texto activado del evento Selecting aparece en la pantalla, se debe a que los datos no se encontraban en la memoria caché y tenían que recuperarse del objeto subyacente. Sin embargo, cuando falta este texto, se debe a que los datos están disponibles en la memoria caché. Cuando se devuelven los datos de la memoria caché no hay ninguna llamada al objeto subyacente y, por lo tanto, no se ejecuta ninguna consulta de base de datos.

The ObjectDataSource Stores and Retrieves its Data from the Data Cache

Figura 12: El objetoDataSource almacena y recupera sus datos de la caché de datos

Cada aplicación ASP.NET tiene su propia instancia de caché de datos que se comparte en todas las páginas y visitantes. Esto significa que los datos almacenados en la caché de datos por ObjectDataSource también se comparten entre todos los usuarios que visitan la página. Para comprobarlo, abra la página ObjectDataSource.aspx en un explorador. Cuando visite por primera vez la página, aparecerá el texto desencadenado del evento Selecting (suponiendo que los datos agregados a la memoria caché por las pruebas anteriores ya se hayan expulsado). Abra una segunda instancia del explorador y copie y pegue la dirección URL de la primera instancia del explorador en la segunda. En la segunda instancia del explorador, no se muestra el texto desencadenado del evento Selecting porque usa los mismos datos almacenados en caché que el primero.

Al insertar sus datos recuperados en la memoria caché, ObjectDataSource usa un valor de clave de caché que incluye: los valores de propiedad CacheDuration y CacheExpirationPolicy. El tipo del objeto de negocio subyacente utilizado por ObjectDataSource, que se especifica a través de la TypeNamepropiedad (ProductsBLL, en este ejemplo); el valor de la propiedad SelectMethod y el nombre y los valores de los parámetros de la colección SelectParameters; y los valores de sus propiedades StartRowIndex y MaximumRows, que se usan al implementar la paginación personalizada .

La creación del valor de clave de caché como combinación de estas propiedades garantiza una entrada de caché única a medida que cambian estos valores. Por ejemplo, en los tutoriales anteriores hemos examinado el uso de la ProductsBLL clase GetProductsByCategoryID(categoryID), que devuelve todos los productos de una categoría especificada. Un usuario puede venir a la página y ver bebidas, que tiene un CategoryID de 1. Si ObjectDataSource almacena en caché sus resultados sin tener en cuenta los valores de SelectParameters, cuando otro usuario llegó a la página para ver los especias mientras los productos de bebidas estaban en la memoria caché, verían los productos de bebidas almacenados en caché en lugar de los condimentos. Al variar la clave de caché por estas propiedades, que incluyen los valores de la SelectParameters, ObjectDataSource mantiene una entrada de caché independiente para bebidas y especias.

Problemas de datos obsoletos

ObjectDataSource expulsa automáticamente sus elementos de la memoria caché cuando se invoca cualquiera de sus métodos Insert, Updateo Delete. Esto ayuda a protegerse contra los datos obsoletos borrando las entradas de caché cuando los datos se modifican a través de la página. Sin embargo, es posible que un ObjectDataSource que use el almacenamiento en caché siga mostrando datos obsoletos. En el caso más sencillo, puede deberse a que los datos cambian directamente dentro de la base de datos. Quizá un administrador de bases de datos acaba de ejecutar un script que modifique algunos de los registros de la base de datos.

Este escenario también podría desarrollarse de una manera más sutil. Aunque ObjectDataSource expulsa sus elementos de la memoria caché cuando se llama a uno de sus métodos de modificación de datos, los elementos almacenados en caché quitados son para la combinación concreta de valores de propiedad objectDataSource (CacheDuration, TypeName, SelectMethod, etc.). Si tiene dos ObjectDataSources que usan diferentes SelectMethods o SelectParameters, pero todavía puede actualizar los mismos datos, un ObjectDataSource puede actualizar una fila e invalidar sus propias entradas de caché, pero la fila correspondiente para el segundo ObjectDataSource seguirá siendo atendida desde la memoria caché. Te animamos a crear páginas para mostrar esta funcionalidad. Cree una página que muestre una GridView editable que extraiga sus datos de un ObjectDataSource que use el almacenamiento en caché y esté configurado para obtener datos del método GetProducts() de la clase ProductsBLL. Agregue otra clase GridView y ObjectDataSource editable a esta página (u otra), pero para este segundo ObjectDataSource, use el método GetProductsByCategoryID(categoryID). Dado que las dos propiedades ObjectDataSources SelectMethod difieren, cada una tendrá sus propios valores almacenados en caché. Si edita un producto en una cuadrícula, la próxima vez que vuelva a enlazar los datos a la otra cuadrícula (paginando, ordenando, etc.), seguirá sirviendo los datos antiguos almacenados en caché y no reflejará el cambio realizado desde la otra cuadrícula.

En resumen, use solo las expiraciones basadas en el tiempo si está dispuesto a tener el potencial de datos obsoletos y use expiraciones más cortas para escenarios en los que es importante la actualización de los datos. Si los datos obsoletos no son aceptables, puede almacenar en caché forgo o usar dependencias de caché de SQL (suponiendo que son datos de base de datos que se almacenan en caché). Exploraremos las dependencias de la caché de SQL en un tutorial futuro.

Resumen

En este tutorial hemos examinado las funcionalidades integradas de almacenamiento en caché de ObjectDataSource. Simplemente estableciendo algunas propiedades, podemos indicar al ObjectDataSource que almacene en caché los resultados devueltos del SelectMethod especificado en la memoria caché de datos de ASP.NET. Las propiedades CacheDuration y CacheExpirationPolicy indican la duración en la que se almacena en caché el elemento y si es una expiración absoluta o deslizante. La propiedad CacheKeyDependency asocia todas las entradas de caché de ObjectDataSource a una dependencia de caché existente. Esto se puede usar para expulsar las entradas de ObjectDataSource de la memoria caché antes de que se alcance la expiración basada en el tiempo y se usa normalmente con dependencias de caché de SQL.

Puesto que ObjectDataSource simplemente almacena en caché sus valores en la memoria caché de datos, podríamos replicar la funcionalidad integrada de ObjectDataSource mediante programación. No tiene sentido hacerlo en la capa de presentación, ya que ObjectDataSource ofrece esta funcionalidad de forma predeterminada, pero podemos implementar funcionalidades de almacenamiento en caché en una capa independiente de la arquitectura. Para ello, es necesario repetir la misma lógica que usa ObjectDataSource. Exploraremos cómo trabajar mediante programación con la caché de datos desde la arquitectura en nuestro siguiente tutorial.

¡Feliz programación!

Lecturas adicionales

Para obtener más información sobre los temas tratados en este tutorial, consulte los siguientes recursos:

Acerca del autor

Scott Mitchell, autor de siete libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha trabajado con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, entrenador y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Puede ponerse en contacto con él a través de mitchell@4GuysFromRolla.com. o de su blog, que se puede encontrar en http://ScottOnWriting.NET.

Agradecimientos especiales a

Esta serie de tutoriales contó con la revisión de muchos revisores que fueron de gran ayuda. El revisor principal de este tutorial fue Teresa Murphy. ¿Le interesaría revisar mis próximos artículos de MSDN? Si fuera así, escríbame a mitchell@4GuysFromRolla.com.