2008-09-15 16 views
2

Disons que j'ai une liste de catégories pour la navigation sur une application web. Plutôt que de sélectionner dans la base de données pour l'utilisateur evey, devrais-je ajouter un appel de fonction dans application_onStart de global.asax pour récupérer ces données dans un tableau ou une collection qui est réutilisé encore et encore. Si mes données ne changent pas du tout - (Edit - very often), serait-ce la meilleure façon?Quelle est la meilleure façon de charger des données hautement réutilisées dans une application web .net

+0

Je suggérerais que quelqu'un avec assez de rep devrait marquer ceci avec «mise en cache» ... – rohancragg

Répondre

2

Vous pouvez stocker les éléments de liste dans l'objet Application. Vous avez raison sur application_onStart(), appelez simplement une méthode qui lira votre base de données et chargera les données dans l'objet Application.

Dans Global.asax

public class Global : System.Web.HttpApplication 
{ 
    // The key to use in the rest of the web site to retrieve the list 
    public const string ListItemKey = "MyListItemKey"; 
    // a class to hold your actual values. This can be use with databinding 
    public class NameValuePair 
    { 
     public string Name{get;set;} 
     public string Value{get;set;} 
     public NameValuePair(string Name, string Value) 
     { 
      this.Name = Name; 
      this.Value = Value; 
     } 
    } 

    protected void Application_Start(object sender, EventArgs e) 
    { 
     InitializeApplicationVariables(); 
    } 


    protected void InitializeApplicationVariables() 
    { 
     List<NameValuePair> listItems = new List<NameValuePair>(); 
     // replace the following code with your data access code and fill in the collection 
     listItems.Add(new NameValuePair("Item1", "1")); 
     listItems.Add(new NameValuePair("Item2", "2")); 
     listItems.Add(new NameValuePair("Item3", "3")); 
     // load it in the application object 
     Application[ListItemKey] = listItems; 
    } 
} 

Maintenant, vous pouvez accéder à votre liste dans le reste du projet. Par exemple, dans default.aspx pour charger les valeurs dans un DropDownList:

<asp:DropDownList runat="server" ID="ddList" DataTextField="Name" DataValueField="Value"></asp:DropDownList> 

Et dans le fichier code-behind:

protected override void OnPreInit(EventArgs e) 
{ 
    ddList.DataSource = Application[Global.ListItemKey]; 
    ddList.DataBind(); 
    base.OnPreInit(e); 
} 
+0

Belle solution avec l'échantillon de code - Cheers. Je dirais que c'est vraiment proche de ce que je cherche. – Mike

0

J'utilise une collection statique en tant que private avec une propriété statique publique qui la charge ou l'extrait de la base de données. En outre, vous pouvez ajouter une date-heure statique qui est définie lorsqu'elle est chargée et si vous l'appelez, après un certain laps de temps, effacez la collection statique et actualisez-la.

1

S'il ne change jamais, il n'a probablement pas besoin d'être dans la base de données.

S'il n'y a pas beaucoup de données, vous pouvez les placer dans le fichier web.config ou enum enum dans votre code.

+0

Bon point. Les données peuvent changer et je n'étais pas clair à ce sujet dans la question, alors je l'ai mis à jour. Pardon. – Mike

1

L'extraction de tout peut être coûteuse. Essayez lazy init, récupérez uniquement les données de la requête, puis stockez-la dans la variable cache.

1

L'optimisation prématurée est mauvaise. Cela étant donné, si vous rencontrez des problèmes de performance dans votre application et que vous avez des informations "statiques" que vous voulez afficher à vos utilisateurs, vous pouvez définitivement charger ces données une fois dans un tableau et les stocker dans l'objet Application. Vous voulez être prudent et équilibrer l'utilisation de la mémoire avec l'optimisation.

Le problème que vous rencontrez est alors de modifier les informations stockées dans la base de données et de ne pas les mettre à jour la version mise en cache. Vous voudrez probablement avoir une sorte de date de dernière modification dans la base de données que vous stockez dans l'état avec les données mises en cache. De cette façon, vous pouvez interroger le plus grand nombre de fois et le comparer. Si c'est plus récent que votre date de mise en cache, vous la sauvegardez et la rechargez.

+0

Point impressionnant! À l'heure actuelle, il n'y a pas de problèmes. Je suis à la recherche de goulots d'étranglement lorsque les sessions se déclenchent rapidement - alias l'effet slashdot/digg/reddit. Le problème du rechargement pourrait être une autre question en soi. – Mike

1

Dans une variable d'application. N'oubliez pas qu'une variable d'application peut contenir un objet dans .Net, vous pouvez donc instancier l'objet dans global.asax et l'utiliser directement dans le code.

Puisque les variables d'application sont en mémoire, ils sont très rapides (vs avoir à appeler une base de données)

Par exemple:

// Create and load the profile object 
x_siteprofile thisprofile = new x_siteprofile(Server.MapPath(String.Concat(config.Path, "templates/"))); 
Application.Add("SiteProfileX", thisprofile); 
1

Je stockerait les données dans le cache Application (objet Cache) . Et je ne voudrais pas le précharger, je le chargerais la première fois qu'il est demandé. Ce qui est bien dans le cache, c'est ASP.NET va le gérer, y compris vous donner des options pour expirer l'entrée de cache après les changements de fichiers, une période de temps, etc. Et puisque les éléments sont gardés en mémoire, les objets ne sont pas sérialisés/désérialisés, donc l'utilisation est très rapide.

L'utilisation est simple. Il existe des méthodes Get et Add sur l'objet Cache pour récupérer et ajouter des éléments au cache respectivement.

+0

Jeff - Super suggestion. J'ai eu quelques problèmes avec la mise en cache Web car tout le reste sur la page est dynamique, même l'en-tête. Je suis resté loin de lui depuis que je veux une nouvelle copie à chaque fois, donc j'aime la route de l'application. Celui qui offre une fois par mois une commodité d'utilisation est le meilleur. – Mike

0

La mise en cache est la solution idéale. Et si vous êtes dans les modèles de conception, jetez un oeil au singleton. Cependant, dans l'ensemble, je ne suis pas sûr que je serais inquiet à ce sujet jusqu'à ce que vous remarquiez une dégradation des performances.