Mise en cache de données avec le contrôle SqlDataSource
Mise à jour : novembre 2007
Le contrôle SqlDataSource peut mettre en cache les données qu'il a récupérées, ce qui permet d'améliorer les performances de vos applications en évitant de réexécuter des requêtes lourdes en ressources. La mise en cache est surtout utile dans des situations où les données changent peu.
En outre, lorsque vous utilisez le contrôle SqlDataSource avec le fournisseur System.Data.SqlClient, vous pouvez faire usage de l'objet SqlCacheDependency. Cela permet au contrôle SqlDataSource de n'actualiser le cache que si les données retournées par SelectCommand ont été modifiées dans la base de données.
Activation de la mise en cache des données avec le contrôle SqlDataSource
Le contrôle SqlDataSource peut mettre en cache des données lorsque sa propriété DataSourceMode a la valeur DataSet. La mise en cache n'est pas activée par défaut, mais vous pouvez l'activer en affectant à la propriété EnableCaching la valeur true.
Les données en cache sont actualisées en fonction d'un intervalle de temps. Vous pouvez affecter à la propriété CacheDuration le nombre de secondes d'attente avant que le cache ne soit actualisé. Le contrôle SqlDataSource gère un élément de cache distinct pour chaque combinaison de valeurs ConnectionString, SelectCommand et SelectParameters.
Vous pouvez contrôler plus étroitement le comportement du cache SqlDataSource en définissant la propriété CacheExpirationPolicy. Une valeur de Absolute force le cache à être actualisé lorsque la valeur CacheDuration est dépassée. Affecter à la propriété CacheExpirationPolicy la valeur Sliding n'actualise le cache que si la valeur CacheDuration a été dépassée depuis la dernière fois que l'on a accédé à l'élément mis en cache.
L'exemple de code suivant illustre un contrôle SqlDataSource configuré pour actualiser les données toutes les 20 secondes :
<%@ 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>
Utilisation de l'objet SqlCacheDependency
Le contrôle SqlDataSource prend en charge une stratégie d'expiration facultative basée sur un objet SqlCacheDependency. Vous pouvez utiliser l'objet SqlCacheDependency pour garantir que les données en mémoire cache ne seront actualisées que si la table source de la base de données a été modifiée. Pour utiliser l'objet SqlCacheDependency, le service de notification Microsoft SQL Server doit être activé pour le serveur de base de données.
Lorsque votre source de données est SQL Server 7.0 ou une version ultérieure, vous pouvez utiliser l'objet SqlCacheDependency pour interroger la base de données afin de savoir si elle a été modifiée, en affectant à la propriété SqlCacheDependency du contrôle SqlDataSource une chaîne composée d'une chaîne de connexion et d'identificateurs de table sous la forme "ConnectionString:Table". Si SqlCacheDependency implique plusieurs tables, la chaîne de connexion et les paires de noms de la table sont séparées par des points-virgules, comme dans l'exemple suivant :
"ConnectionString1:Table1;ConnectionString2:Table2".
Si votre source de données est Microsoft SQL Server 2005, vous disposez d'une option supplémentaire qui consiste à faire prévenir votre application par SQL Server lorsque des modifications ont eu lieu, plutôt que d'avoir à les rechercher. Vous pouvez utiliser le modèle de notification en affectant à la propriété SqlCacheDependency la chaîne "CommandNotification". Pour plus d'informations sur l'objet SqlCacheDependency, consultez Mise en cache dans ASP.NET avec la classe SqlCacheDependency
L'exemple de code suivant montre comment créer une dépendance de cache Microsoft SQL Server et affecter à la propriété SqlCacheDependency un contrôle SqlDataSource. Dans l'exemple, la base de données est interrogée toutes les 120 secondes. Si les données de la table Northwind Employees changent dans cet intervalle de temps, les données mises en cache par le contrôle SqlDataSource et affichées par le contrôle GridView sont actualisées la prochaine fois que la base de données est appelée.
<%@ 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>
Voir aussi
Concepts
Vue d'ensemble du contrôle serveur Web SqlDataSource