Compartilhar via


Fazendo Cache de Dados com o Controle SqlDataSource

O controle SqlDataSource pode armazenar em cache os dados que ele recuperou, o que pode melhorar o desempenho de seus aplicativos, evitando a necessidade de executar novamente consultas pesadas.O cache é útil principalmente em situações onde os dados não se alteram com frequência.

Além disso, quando usar o controle SqlDataSource com o provedor System.Data.SqlClient, você pode fazer uso do objeto SqlCacheDependency.Isso permite que o controle SqlDataSource atualize o cache somente se os dados retornados por SelectCommand foram modificados no banco de dados.

Habilitando o cache com o controle SqlDataSource

O controle SqlDataSource pode armazenar em cache os dados quando sua propriedade DataSourceMode é definida como DataSet.O cache não está ativado por padrão, mas você pode ativá-lo definindo a propriedade EnableCaching como true.

Dados armazenados em cache são atualizados com base em um intervalo tempo.Você pode definir a propriedade CacheDuration para o número de segundos de espera antes do cache ser atualizado.O controle SqlDataSource mantém um item de cache separado para cada combinação de valores ConnectionString, SelectCommand e SelectParameters.

Você pode controlar ainda mais o comportamento do cache SqlDataSource definindo a propriedade CacheExpirationPolicy.Um valor de Absolute força o cache a ser atualizado quando o valor CacheDuration é excedido.Definir a propriedade CacheExpirationPolicy como Sliding atualiza o cache somente se o valor CacheDuration foi excedido desde a última vez que o item em cache foi acessado.

O exemplo de código a seguir mostra um controle SqlDataSource configurado para atualizar os dados a 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>

Usando o objeto SqlCacheDependency

O controle SqlDataSource suporta uma diretiva de vencimento opcional com base em um objeto SqlCacheDependency.Você pode usar o objeto SqlCacheDependency para garantir que dados armazenados em cache são atualizados somente quando a tabela de origem no banco de dados foi modificada.Para poder usar o objeto SqlCacheDependency, o serviço de notificação do Microsoft SQL Server deve estar executando para o servidor de banco de dados.

Quando a fonte de dados é o SQL Server 7.0 ou posterior, você pode usar o objeto SqlCacheDependency para pesquisar o banco de dados por as alterações, definindo a propriedade SqlCacheDependency do controle SqlDataSource para uma cadeia de caracteres que consiste em um cadeia de caracteres de conexão e identificadores de tabela na forma " Cadeia de Caracteres de Conexão : Tabela ".Se o SqlCacheDependency envolve mais de uma tabela, os pares de cadeia de caracteres de conexão e nomes de tabela são separados por ponto-e-vírgula, como no exemplo a seguir:

"Cadeia de Caracteres de Conexão 1:Tabela1;Cadeia de Caracteres de Conexão 2:Tabela2".

Quando a fonte de dados é o Microsoft SQL Server 2005, você tem a opção adicional de fazer o SQL Server notificar seu aplicativo de mudanças ao invés de monitorar por mudanças.Você pode usar o modelo de notificação, definindo a propriedade SqlCacheDependency para a cadeia de caracteres "CommandNotification".Para mais informações sobre o objeto SqlCacheDependency, veja Armazenamento em ASP.NET com a Classe SqlCacheDependency.

O exemplo de código a seguir demonstra como criar uma dependência de cache Microsoft SQL Server e definir a propriedade SqlCacheDependency de um controle SqlDataSource.No exemplo, o banco de dados é monitorado a cada 120 segundos.Se os dados da tabela de funcionários da Northwind alterar durante esse tempo, os dados armazenados em cache pelo controle de SqlDataSource e exibidos pelo controle GridView serão atualizados na próxima vez em que o banco de dados for monitorado.

<%@ 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>

Consulte também

Conceitos

Visão geral sobre o controle de servidor Web SqlDataSource

Outros recursos

ASP.NET Caching

Controles Servidores da Web com fonte de dados