Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

17 août 2007 5 17 /08 /août /2007 00:13
[ Caching ] - Une classe d’expiration basée sur Sql Dependency pour SQL Server
 
Je me développe ma propre librairie de Caching(celle-ci devra permettre plusieurs types d’expirations :
-          Absolue : le cacheItem devra être supprimé à la date fixée
-          Relative (sliding) : le cacheItem ajouté au cache devra être supprimé dans un temps déterminé
-          Pour SQL Server : je me base sur SqlDependency(pour applications de bureaux),pour le web il faudra que je vois si j’utilise SqlCacheDependency
-          Pour Access : ce sera juste FileSystemWatcher qui « observera » le fichier de base de données *.mdb (ou *.accdb)
Je présente ici ma classe d’expiration basée sur SqlDependency
Cette classe devrait même être utilisable avec Enterprise Library vu que je me base sur les patterns and practices (donc il faudra que je teste mais simplement en l’ajoutant dans les expirations du projet Caching)
public class SqlDependencyExpiration : ICacheItemExpiration
    {
        private bool isExpired;
 
        public SqlDependencyExpiration(SqlCommand command)
        {
            SqlDependency.Stop(command.Connection.ConnectionString);
            SqlDependency.Start(command.Connection.ConnectionString);
 
            command.Notification = null;
            SqlDependency sqlDependency = new SqlDependency(command);
            sqlDependency.OnChange += new OnChangeEventHandler(OnChanged);
 
            if (command.Connection.State == ConnectionState.Closed)
                command.Connection.Open();
 
            command.ExecuteReader(CommandBehavior.CloseConnection);
        }
        void OnChanged(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency sqlDependency = sender as SqlDependency;
            sqlDependency.OnChange -= OnChanged;
            isExpired = true;
        }
 
        #region ICacheItemExpiration Membres
 
        public bool HasExpired()
        {
            return isExpired;
        }
 
        #endregion
 
    }
 
Utilisation :
 private void button1_Click(object sender, EventArgs e)
        {
            DataTable dataTable = new DataTable();
 
            if (manager.Get("1") != null)
            {
                dataTable =(DataTable) manager.Get("1").Value;
                label1.Text = "from cache";
            }
            else
            {
                SqlCommand sqlCommand = new SqlCommand("Select ContactID,Contactname from dbo.[Contact]", new SqlConnection("Data Source=.;Initial Catalog=ContactDB;Integrated Security=SSPI;"));
                sqlCommand.Connection.Open();
                dataTable.Load(sqlCommand.ExecuteReader());
                label1.Text = "from sql server";
               
                manager.Add("1", dataTable, new ICacheItemExpiration[] { new SqlDependencyExpiration(sqlCommand) });
 
            }
            dataGridView1.DataSource = dataTable;
}
 
 
C’est donc un début lorsque tout sera en place peut être que je présenterais plus en détails, sachant qu’à terme cette librairie devrait être ajoutée à un de mes projets > CS2GEN (disponible sur Codeplex et CodeS-SourceS)

Partager cet article

Repost 0
Published by Romagny13 - dans ADO.NET
commenter cet article

commentaires