SqlDependency dans une application ASP.NET
L’exemple de cette section montre comment utiliser SqlDependency indirectement en tirant parti de l’objet ASP.NET SqlCacheDependency. L’objet SqlCacheDependency utilise une SqlDependency pour écouter les notifications et mettre correctement à jour le cache.
Notes
L’exemple de code est basé sur l’hypothèse que vous avez activé les notifications de requêtes en exécutant les scripts dans Activation des notifications de requêtes.
À propose de l'exemple d'application
L’exemple d’application utilise une page web ASP.NET unique pour afficher les références des produits extraites de la base de données SQL Server AdventureWorks dans un contrôle GridView. Lors du chargement de la page, le code écrit l’heure actuelle dans un contrôle Label. Il définit ensuite un objet SqlCacheDependency puis des propriétés sur l’objet Cache pour stocker les données du cache pendant trois minutes maximum. Le code se connecte ensuite à la base de données et récupère les données. Lorsque la page est chargée et que l’application est en cours d’exécution, ASP.NET récupère les données du cache, que vous pouvez vérifier en notant que l’heure sur la page n’est pas modifiée. Si les données analysées sont modifiées, ASP.NET invalide le cache et remplit à nouveau le contrôle de GridView
avec les données actualisées, en mettant à jour l’heure affichée dans le contrôle Label
.
Création de l'exemple d'application
Procédez comme suit pour créer et exécuter l’exemple d’application :
Créez un site web ASP.NET.
Ajoutez un Label et un contrôle GridView à la page Default.aspx.
Ouvrez le module de classe de la page et ajoutez les directives suivantes :
Option Strict On Option Explicit On Imports System.Data.SqlClient
using System.Data.SqlClient; using System.Web.Caching;
Ajoutez le code suivant dans l’événement
Page_Load
de la page :protected void Page_Load(object sender, EventArgs e) { Label1.Text = "Cache Refresh: " + DateTime.Now.ToLongTimeString(); // Create a dependency connection to the database. SqlDependency.Start(GetConnectionString()); using (SqlConnection connection = new SqlConnection(GetConnectionString())) { using (SqlCommand command = new SqlCommand(GetSQL(), connection)) { SqlCacheDependency dependency = new SqlCacheDependency(command); // Refresh the cache after the number of minutes // listed below if a change does not occur. // This value could be stored in a configuration file. int numberOfMinutes = 3; DateTime expires = DateTime.Now.AddMinutes(numberOfMinutes); Response.Cache.SetExpires(expires); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetValidUntilExpires(true); Response.AddCacheDependency(dependency); connection.Open(); GridView1.DataSource = command.ExecuteReader(); GridView1.DataBind(); } } }
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Label1.Text = "Cache Refresh: " & _ Date.Now.ToLongTimeString() ' Create a dependency connection to the database SqlDependency.Start(GetConnectionString()) Using connection As New SqlConnection(GetConnectionString()) Using command As New SqlCommand(GetSQL(), connection) Dim dependency As New SqlCacheDependency(command) ' Refresh the cache after the number of minutes ' listed below if a change does not occur. ' This value could be stored in a configuration file. Dim numberOfMinutes As Integer = 3 Dim expires As Date = _ DateTime.Now.AddMinutes(numberOfMinutes) Response.Cache.SetExpires(expires) Response.Cache.SetCacheability(HttpCacheability.Public) Response.Cache.SetValidUntilExpires(True) Response.AddCacheDependency(dependency) connection.Open() GridView1.DataSource = command.ExecuteReader() GridView1.DataBind() End Using End Using End Sub
Ajoutez deux méthodes d'assistance,
GetConnectionString
etGetSQL
. La chaîne de connexion définie utilise une sécurité intégrée. Vous devez vérifier que le compte que vous utilisez dispose des autorisations de base de données nécessaires et que les notifications sont activées dans l’exemple de base de données, AdventureWorks.private string GetConnectionString() { // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. return "Data Source=(local);Integrated Security=true;" + "Initial Catalog=AdventureWorks;"; } private string GetSQL() { return "SELECT Production.Product.ProductID, " + "Production.Product.Name, " + "Production.Location.Name AS Location, " + "Production.ProductInventory.Quantity " + "FROM Production.Product INNER JOIN " + "Production.ProductInventory " + "ON Production.Product.ProductID = " + "Production.ProductInventory.ProductID " + "INNER JOIN Production.Location " + "ON Production.ProductInventory.LocationID = " + "Production.Location.LocationID " + "WHERE ( Production.ProductInventory.Quantity <= 100 ) " + "ORDER BY Production.ProductInventory.Quantity, " + "Production.Product.Name;"; }
Private Function GetConnectionString() As String ' To avoid storing the connection string in your code, ' you can retrieve it from a configuration file. Return "Data Source=(local);Integrated Security=true;" & _ "Initial Catalog=AdventureWorks;" End Function Private Function GetSQL() As String Return "SELECT Production.Product.ProductID, " & _ "Production.Product.Name, " & _ "Production.Location.Name AS Location, " & _ "Production.ProductInventory.Quantity " & _ "FROM Production.Product INNER JOIN " & _ "Production.ProductInventory " & _ "ON Production.Product.ProductID = " & _ "Production.ProductInventory.ProductID " & _ "INNER JOIN Production.Location " & _ "ON Production.ProductInventory.LocationID = " & _ "Production.Location.LocationID " & _ "WHERE ( Production.ProductInventory.Quantity <= 100) " & _ "ORDER BY Production.ProductInventory.Quantity, " & _ "Production.Product.Name;" End Function
Test de l’application
L’application met en cache les données affichées sur le formulaire Web et l’actualise toutes les trois minutes en l’absence d’activité. Si une modification est apportée à la base de données, le cache est actualisé immédiatement. Exécutez l’application à partir de Visual Studio, qui charge la page dans le navigateur. L’heure d’actualisation du cache affichée indique à quel moment le cache a été actualisé pour la dernière fois. Attendez trois minutes, puis actualisez la page, provoquant ainsi l’exécution d’un événement de publication (postback). Notez que l’heure affichée sur la page a changé. Si vous actualisez la page en moins de trois minutes, l’heure affichée sur la page reste la même.
Mettez à jour les données dans la base de données en utilisant une commande Transact-SQL UPDATE et en actualisant la page. L’heure affichée indique maintenant que le cache a été actualisé avec les nouvelles données de la base de données. Notez que même si le cache est mis à jour, l’heure affichée sur la page n’est pas modifiée tant qu’un événement de publication ne se produit pas.
Synchronisation de cache distribué à l’aide d’une dépendance SQL
Certains des caches distribués tiers tels que NCache prennent en charge la synchronisation de la base de données et du cache SQL à l’aide d’une dépendance SQL. Pour plus d’informations et un exemple d’implémentation de code source, consultez Exemple de dépendance SQL de cache distribué.