Condividi tramite


Inserimento dei dati nella cache con il controllo SqlDataSource

Aggiornamento: novembre 2007

Il controllo SqlDataSource è in grado di memorizzare nella cache i dati recuperati, migliorando così le prestazioni delle applicazioni eliminando la necessità di eseguire nuovamente query che richiedono un utilizzo intensivo di risorse. L'inserimento dei dati nella cache è utile soprattutto nei casi in cui i dati non variano spesso.

Inoltre, utilizzando il controllo SqlDataSource con il provider System.Data.SqlClient, è possibile servirsi dell'oggetto SqlCacheDependency. Tale oggetto permette al controllo SqlDataSource di aggiornare la cache solo se i dati restituiti da SelectCommand sono stati modificati nel database.

Attivazione dell'inserimento dati nella cache con il controllo SqlDataSource

Il controllo SqlDataSource è in grado di inserire i dati nella cache quando la proprietà DataSourceMode è impostata su DataSet. Per impostazione predefinita, l'inserimento dei dati nella cache non è attivato: è possibile tuttavia attivarlo impostando la proprietà EnableCaching su true.

I dati inseriti nella cache vengono aggiornati a intervalli regolari. È possibile impostare la proprietà CacheDuration con il numero di secondi che devono trascorrere prima del successivo aggiornamento della cache. Il controllo SqlDataSource mantiene un elemento separato della cache per ogni combinazione dei valori ConnectionString, SelectCommand e SelectParameters.

È possibile controllare ulteriormente il comportamento della cache SqlDataSource impostando la proprietà CacheExpirationPolicy. Un valore di Absolute forza l'aggiornamento della cache trascorso il valore CacheDuration. Impostando la proprietà CacheExpirationPolicy su Sliding si aggiorna la cache solo se è trascorso il valore CacheDuration dall'ultimo accesso a un elemento della cache.

Nell'esempio di codice riportato di seguito viene illustrato un controllo SqlDataSource configurato per aggiornare i dati ogni 20 secondi.

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

Utilizzo dell'oggetto SqlCacheDependency

Il controllo SqlDataSource supporta un criterio di scadenza facoltativo basato sull'oggetto SqlCacheDependency. È possibile utilizzare l'oggetto SqlCacheDependency per assicurare che l'aggiornamento dei dati nella cache avvenga solo quando la tabella di origine nel database è stata modificata. Per utilizzare l'oggetto SqlCacheDependency, è necessario che nel server del database sia in esecuzione il servizio di notifica di Microsoft SQL Server.

Se l'origine dati è SQL Server 7.0 o versione successiva, è possibile utilizzare l'oggetto SqlCacheDependency per eseguire il polling delle modifiche nel database impostando la proprietà SqlCacheDependency del controllo SqlDataSource su una stringa composta da una stringa di connessione e da identificatori della tabella nel formato "StringaConnessione:Tabella". Se SqlCacheDependency interessa più di una tabella, la stringa di connessione e le coppie dei nomi delle tabelle sono separate da punti e virgola, come nell'esempio seguente:

"StringaConnessione1:Tabella1;StringaConnessione2:Tabella2".

Se l'origine dati è Microsoft SQL Server 2005, è disponibile anche l'opzione SQL Server di notifica all'applicazione in presenza di modifiche, in alternativa al polling. È possibile utilizzare il modello di notifica impostando la proprietà SqlCacheDependency con la stringa "CommandNotification". Per ulteriori informazioni sull'oggetto SqlCacheDependency, vedere Inserimento nella cache in ASP.NET con la classe SqlCacheDependency.

Nell'esempio di codice riportato di seguito viene illustrato come creare una dipendenza della cache con Microsoft SQL Server e impostare la proprietà SqlCacheDependency di un controllo SqlDataSource. Nell'esempio, il polling del database avviene ogni 120 secondi. Se i dati della tabella Employees del database Northwind cambiano durante questo intervallo, i dati inseriti nella cache dal controllo SqlDataSource e visualizzati dal controllo GridView vengono aggiornati al successivo polling del database.

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

Vedere anche

Concetti

Cenni preliminari sul controllo server Web SqlDataSource

Altre risorse

Memorizzazione nella cache ASP.NET

Controlli server Web dell'origine dati