Compartir a través de


Almacenar datos en caché con el control SqlDataSource

Actualización: noviembre 2007

El control SqlDataSource puede almacenar en memoria caché los datos que ha recuperado, lo que puede mejorar el rendimiento de las aplicaciones al evitar la necesidad de volver a ejecutar consultas que consumen muchos recursos. El almacenamiento en caché es útil principalmente en aquellas situaciones en las que los datos no cambian con frecuencia.

Además, al utilizar el control SqlDataSource con el proveedor System.Data.SqlClient, se puede emplear el objeto SqlCacheDependency. Esto permite al control SqlDataSource actualizar la caché sólo si los datos devueltos por la propiedad SelectCommand se han modificado en la base de datos.

Habilitar la caché con el control SqlDataSource

El control SqlDataSource puede almacenar datos en la caché cuando su propiedad DataSourceMode se establece en DataSet. El almacenamiento en caché no está habilitado de forma predeterminada, pero se puede habilitar estableciendo la propiedad EnableCaching en true.

Los datos almacenados en memoria caché se actualizan basándose en un intervalo de tiempo. Puede establecer la propiedad CacheDuration en el número de segundos que se debe esperar antes de actualizar la caché. El control SqlDataSource mantiene un elemento de caché independiente para cada combinación de valores de ConnectionString, SelectCommand y SelectParameters.

Puede controlar aún más el comportamiento de la caché de SqlDataSource si establece la propiedad CacheExpirationPolicy. Un valor de Absolute fuerza la actualización de la caché cuando se supera el valor de CacheDuration. Si la propiedad CacheExpirationPolicy se establece en Sliding, sólo se actualiza la caché cuando se ha superado el valor de CacheDuration desde la última vez en que se tuvo acceso al elemento almacenado en la caché.

En el ejemplo de código siguiente se muestra un control SqlDataSource configurado para actualizar los datos cada 20 segundos:

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head >
    <title>ASP.NET Example</title>
</head>
<body>
        <form id="form1" >

            <asp:SqlDataSource
                id="SqlDataSource1"
                
                DataSourceMode="DataSet"
                ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
                EnableCaching="True"
                CacheDuration="20"
                SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees">
            </asp:SqlDataSource>

            <asp:GridView
                id="GridView1"
                
                AutoGenerateColumns="False"
                DataSourceID="SqlDataSource1">
                <columns>
                    <asp:BoundField HeaderText="First Name" DataField="FirstName" />
                    <asp:BoundField HeaderText="Last Name" DataField="LastName" />
                    <asp:BoundField HeaderText="Title" DataField="Title" />
                </columns>
            </asp:GridView>

        </form>
    </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head >
    <title>ASP.NET Example</title>
</head>
<body>
        <form id="form1" >

            <asp:SqlDataSource
                id="SqlDataSource1"
                
                DataSourceMode="DataSet"
                ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
                EnableCaching="True"
                CacheDuration="20"
                SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees">
            </asp:SqlDataSource>

            <asp:GridView
                id="GridView1"
                
                AutoGenerateColumns="False"
                DataSourceID="SqlDataSource1">
                <columns>
                    <asp:BoundField HeaderText="First Name" DataField="FirstName" />
                    <asp:BoundField HeaderText="Last Name" DataField="LastName" />
                    <asp:BoundField HeaderText="Title" DataField="Title" />
                </columns>
            </asp:GridView>

        </form>
    </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head >
    <title>ASP.NET Example</title>
</head>
<body>
        <form id="form1" >

            <asp:SqlDataSource
                id="SqlDataSource1"
                
                DataSourceMode="DataSet"
                ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
                EnableCaching="True"
                CacheDuration="20"
                SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees">
            </asp:SqlDataSource>

            <asp:GridView
                id="GridView1"
                
                AutoGenerateColumns="False"
                DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField HeaderText="First Name" DataField="FirstName" />
                    <asp:BoundField HeaderText="Last Name" DataField="LastName" />
                    <asp:BoundField HeaderText="Title" DataField="Title" />
                </Columns>
            </asp:GridView>

        </form>
    </body>
</html>

Utilizar el objeto SqlCacheDependency

El control SqlDataSource admite una directiva de caducidad opcional basada en un objeto SqlCacheDependency. Puede utilizar el objeto SqlCacheDependency para asegurarse de que los datos almacenados en la caché sólo se actualizan cuando se ha modificado la tabla de origen de la base de datos. Para poder utilizar el objeto SqlCacheDependency, el servicio de notificación de Microsoft SQL Server debe estar en ejecución para el servidor de bases de datos.

Cuando el origen de datos es SQL Server 7.0 o versiones posteriores, puede utilizar el objeto SqlCacheDependency para sondear la base de datos en busca de cambios si establece la propiedad SqlCacheDependency del control SqlDataSource en una cadena que consiste en una cadena de conexión e identificadores de tabla con el formato "CadenaConexión:Tabla". Si la propiedad SqlCacheDependency comprende varias tablas, los pares de cadena de conexión y nombre de tabla están separados mediante signos de punto y coma, como en el ejemplo siguiente:

"CadenaConexión1:Tabla1;CadenaConexión2:Tabla2".

Si el origen de datos es Microsoft SQL Server 2005, dispone de una opción adicional: hacer que SQL Server notifique los cambios a la aplicación, en lugar de realizar un sondeo para buscarlos. Puede utilizar el modelo de notificación si establece la propiedad SqlCacheDependency en la cadena "CommandNotification". Para obtener más información sobre el objeto SqlCacheDependency, vea Almacenar en caché en ASP.NET con la clase SqlCacheDependency.

En el ejemplo de código siguiente se muestra cómo crear una dependencia de caché de Microsoft SQL Server y cómo establecer la propiedad SqlCacheDependency de un control SqlDataSource. En el ejemplo, la base de datos se sondea cada 120 segundos. Si los datos de la tabla Employees de Northwind cambian durante ese intervalo de tiempo, los datos almacenados en caché por el control SqlDataSource y mostrados por el control GridView se actualizan la próxima vez que se sondee la base de datos.

<%@ Page language="vb" %>

<!--

The page uses an example configuration that includes
connection strings and a defined SqlCacheDependecy.

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <add name="MyNorthwind"
         connectionString="Data Source="localhost";Integrated Security="SSPI";Initial Catalog="Northwind""
         providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <cache>
      <sqlCacheDependency enabled="true">
        <databases>
          <add
            name="Northwind"
            connectionStringName="MyNorthwind"
            pollTime="120000" />
        </databases>
      </sqlCacheDependency>
    </cache>

  </system.web>
</configuration>
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" method="post" >

        <asp:gridview
          id="GridView1"
          
          datasourceid="SqlDataSource1" />

        <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT EmployeeID,FirstName,Lastname FROM Employees"
          enablecaching="True"
          cacheduration="300"
          cacheexpirationpolicy="Absolute"
          sqlcachedependency="Northwind:Employees" />

    </form>
  </body>
</html>
<%@ Page language="c#" %>

<!--

The page uses an example configuration that includes
connection strings and a defined SqlCacheDependecy.

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <add name="MyNorthwind"
         connectionString="Data Source="localhost";Integrated Security="SSPI";Initial Catalog="Northwind""
         providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <cache>
      <sqlCacheDependency enabled="true">
        <databases>
          <add
            name="Northwind"
            connectionStringName="MyNorthwind"
            pollTime="120000" />
        </databases>
      </sqlCacheDependency>
    </cache>

  </system.web>
</configuration>
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" method="post" >

        <asp:gridview
          id="GridView1"
          
          datasourceid="SqlDataSource1" />

        <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT EmployeeID,FirstName,Lastname FROM Employees"
          enablecaching="True"
          cacheduration="300"
          cacheexpirationpolicy="Absolute"
          sqlcachedependency="Northwind:Employees" />

    </form>
  </body>
</html>
<%@ Page language="VJ#" %>

<!--

The page uses an example configuration that includes
connection strings and a defined SqlCacheDependecy.

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <add name = "NorthwindConnection" connectionString = "Data Source="localhost";Integrated Security="SSPI";Initial Catalog="Northwind"" />
  </connectionStrings>

  <system.web>

    ...

    <cache>
      <sqlCacheDependency enabled="true">
        <databases>
          <add
            name="Northwind_Remote"
            connectionStringName="NorthwindConnection"
            pollTime="120000" />
        </databases>
      </sqlCacheDependency>
    </cache>

  </system.web>
</configuration>
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" method="post" >

        <asp:gridview
          id="GridView1"
          
          datasourceid="SqlDataSource1" />

        <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind"
          selectcommand="SELECT EmployeeID,FirstName,Lastname FROM Employees"
          enablecaching="True"
          cacheduration="300"
          cacheexpirationpolicy="Absolute"
          sqlcachedependency="Northwind_Remote:Employees" />

    </form>
  </body>
</html>

Vea también

Conceptos

Información general sobre SqlDataSource (Control de servidor Web)

Otros recursos

Almacenamiento en caché en ASP.NET

Controles de servidor web de orígenes de datos