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