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

- Hook sous Vista : il faut montrer patte blanche par Blog d'Olivier Huet le il y a 1 heure et 6 minutes

- EF et WPF : Réponse à Thomas par Matthieu MEZIL le il y a 3 heures et 32 minutes

- EF et WPF par Matthieu MEZIL le il y a 18 heures et 46 minutes

- C# : Vérifications / Performances par Pierrick's Blog le il y a 22 heures et 21 minutes

- Du nouveau sur le clubvsts par Noham Choulant le 08-29-2008, 16:20

- StyleCop SDK disponible par Michel Perfetti [Miiitch] le 08-29-2008, 13:59

- Data Structures and Algorithms : un livre gratuit par Elise's blog le 08-29-2008, 11:39

- [ASP.NET] - Ajax vNext Preview 2 par Aurelien's Blog - When ClientSide meets .Net le 08-29-2008, 10:35

- TPH IS Not Null sur la relation par Matthieu MEZIL le 08-29-2008, 08:15

- Mise à jours du code Source du .NET Framework 3.5 SP1 disponible sur le Reference Source Code Center par RedoBlog - The .NET Gentleman !!! le 08-29-2008, 01:50