Publié lundi 26 mai 2008 14:59 par Luke77

Configuration en base de données - Partie 1

Je reviens après de longs jours d'absence, pour cause de fin de projet et accessoirement de vacances, que je reviens pour écrire ce post.

Comme je l'ai indiqué, les posts que j'écris sont en rapport direct avec un projet que j'essaye de mener depuis de nombreux mois. Ils n'entendent pas révolutionner la façon dont les choses sont faîtes, ni utiliser les dernières technologies à la mode sauf si ces dernières peuvent apporter un réel bénéfice au projet.

Ainsi après avoir établi le Cache, élément indispensable (selon moi), il vient une autre partie que je trouve tout aussi indispensable, une gestion de la configuration. Le Framework propose pour cela une gestion de la configuration à l'aide des sections dans les fichiers .config . Cette configuration fonctionne très bien et est qui plus est très pratique.

Cependant lorsque l'on travaille dans une ferme, modifier ces fichiers de configuration impose de redéployer sur l'ensemble de la ferme (ce qui implique potentiellement d'autres services tel que celui chargé de la production par exemple), et fait aussi redémarrer le site web sur chaque frontal. De même, lorsque une configuration est partagée entre plusieurs applications, impacter toutes les applications lorsqu'une modification a lieu n'est pas forcement une chose aisée non plus.

Pour palier ces désagréments, j'ai eu l'occasion de mettre en place chez mon client adoré un petit système simple de configuration géré en base de données dont je me propose d'expliquer ici son fonctionnement.

 

Comme indiqué quelques lignes plus haut, cette configuration doit pouvoir être commune à plusieurs applications. Cependant chaque application doit avoir la possibilité de surcharger cette valeur par ses valeurs propres. Enfin Il faut que l'information en base de données soit un minimum structurée et que les valeurs chargées depuis la base de données soient montées en cache.

Tout d'abord, définissons le moyen d'identifier l'application en cours, et le moyen d'accéder à la base de donnée. Il faut bien un minimum de configuration dans des fichiers, cela se définira donc au niveau du .config grâce à  une section créée pour l'occasion. Voici le code bien compliqué de la section :

   1: internal class StartupConfigurationSection : ConfigurationSection
   2: {
   3:     [ConfigurationProperty("ApplicationName", IsRequired=true)]
   4:     public string ApplicationName
   5:     {
   6:         get { return (string)this["ApplicationName"]; }
   7:     }
   8:  
   9:     [ConfigurationProperty("ConnectionStringName", IsRequired = false, DefaultValue = "Default")]
  10:     public string ConnectionStringName
  11:     {
  12:         get { return (string)this["ConnectionStringName"]; }
  13:     }
  14: }

que l'on configure comme ceci dans le .config par exemple :

   1: <configSections>
   2:     <section name="startupConfiguration" type="JALUM.Utility.Configuration.StartupConfigurationSection, JALUM.Utility.Configuration"/>
   3: </configSections>
   4:  
   5: <startupConfiguration ApplicationName="ConfigurationManager"/>
   6:  
   7: <connectionStrings>
   8:     <add name="Default" connectionString="Data Source=localhost;Initial Catalog=Configuration;Integrated Security=SSPI"/>
   9: </connectionStrings>

Ensuite en base, il est nécessaire d'avoir une petite table qui va contenir les données sous la forme clé / valeur (les tailles des champs sont donnés à titre indicatif) :

Table Définition

et la procédure stockée qui va bien avec pour récupérer les valeurs :

   1: CREATE PROCEDURE [Conf].[P_GetConfigurationAttribute]
   2:     -- Add the parameters for the stored procedure here
   3:     @ApplicationName nvarchar(64) = null,
   4:     @Key nvarchar(128)
   5: AS
   6: BEGIN
   7:  
   8:     IF (@ApplicationName IS NULL)
   9:     BEGIN
  10:         SELECT [Value]
  11:         FROM [T_ConfigurationAttributes] (NOLOCK)
  12:         WHERE [ApplicationName] IS NULL AND [Key] = @Key
  13:     END
  14:     ELSE
  15:     BEGIN
  16:         SELECT [Value]
  17:         FROM [T_ConfigurationAttributes] (NOLOCK)
  18:         WHERE [ApplicationName] = @ApplicationName AND [Key] = @Key
  19:     END
  20: END

 

Et voilà pour la première partie de la future couche de configuration. Ok rien de bien fabuleux non plus mais petit à petit l'oiseau fait son nid...

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

# re: Configuration en base de données - Partie 1 @ lundi 26 mai 2008 17:13

Au niveau de la procédure stockée, je ne vois définitivement pas l'intéret de mettre des NOLOCK au niveau des tables accédées. De toute façon il vaut mieux dans ce cas que SQL Server se fasse bloquer lorsqu'il essaye de lire un valeur de config en tant que modif, sinon j'ai un peu peur du résultat !

christian

# re: Configuration en base de données - Partie 1 @ mardi 27 mai 2008 13:19

Si ça a un intérêt : ça va plus vite !

Et pourquoi risquer de poser des verrous sur des infos que l'on lit ?

Emc51


Les 10 derniers blogs postés

- [WF4] Passage d’arguments Literal, VisualBasicValue ou LambdaValue? par Blog de Jérémy Jeanson le il y a 55 minutes

- [RIA Services] Include et DomainDataSource par Blog Technique d'Audrey PETIT le il y a 12 heures et 19 minutes

- ZUNE : Version ZUNE Software V 4.2 et la socialisation par Blog Technique de Romelard Fabrice le il y a 13 heures et 44 minutes

- Pratique de Silverlight par Eric Ambrosi par Blog de Frédéric Queudret le il y a 15 heures et 51 minutes

- Apprendre à développer pour les mobiles avec la nouvelle génération .NET par Perspective le il y a 17 heures et 7 minutes

- ZUNE : Nouvelle version du ZUNE Software – V 4.2 par Blog Technique de Romelard Fabrice le il y a 17 heures et 32 minutes

- Nouveau système d'aide pour Visual Studio 2010 : pour ceux qui n'apprécient pas trop l'absence d'index... par CoqBlog le 03-20-2010, 20:05

- L'interface naturelle de Windows Phone 7 Series par Perspective le 03-20-2010, 18:49

- Comment mapper une vue SQL sur une collection de complex type? par Matthieu MEZIL le 03-19-2010, 21:05

- SQL Server : Query Notification ou comment être notifié de modifications de données côté application (SqlDependency) par SQL Server vu par Christian Robert le 03-19-2010, 15:06