Quel est le meilleur moyen de charger des données hautement réutilisées dans une application Web .net

StackOverflow https://stackoverflow.com/questions/64284

  •  09-06-2019
  •  | 
  •  

Question

Supposons que j'ai une liste de catégories pour la navigation sur une application Web. Plutôt que de choisir dans la base de données pour chaque utilisateur, devrais-je ajouter un appel de fonction dans le répertoire application_onStart du fichier global.asax pour extraire ces données dans un tableau ou une collection réutilisé encore et encore? Si mes données ne changent pas du tout - (Edit - très souvent), serait-ce le meilleur moyen?

Était-ce utile?

La solution

Vous pouvez stocker les éléments de la 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;
    }
 }

Vous pouvez maintenant accéder à votre liste dans la suite du projet. Par exemple, dans default.aspx pour charger les valeurs dans une 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);
}

Autres conseils

S'il ne change jamais, il n'est probablement pas nécessaire qu'il soit dans la base de données.

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

Tout récupérer peut coûter cher. Essayez lazy init, récupérez uniquement les données de requête, puis stockez-les dans la variable de cache.

L'optimisation prématurée est diabolique. Ceci étant une donnée, si vous rencontrez des problèmes de performances dans votre application et que vous avez " statique " informations que vous souhaitez afficher à vos utilisateurs, vous pouvez certainement les charger 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 à ce moment-là est de changer les informations stockées dans la base de données et de ne pas le faire 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 rechercher le plus grand temps modifié et le comparer. Si elle est plus récente que la date que vous avez mise en cache, transférez-la et rechargez-la.

Dans une variable d'application.

N'oubliez pas qu'une variable d'application peut contenir un objet en .Net. Vous pouvez donc instancier l'objet dans le fichier global.asax, puis l'utiliser directement dans le code.

Les variables d’application étant en mémoire, elles sont très rapides (par opposition à l’appel d’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);

Je stockerais les données dans le cache d’application (objet Cache). Et je ne le préchargerais pas, je le chargerais la première fois que cela est demandé. Ce qui est bien avec le cache, c’est qu’ASP.NET le gérera, notamment en vous donnant des options pour expirer l’entrée du cache après des modifications de fichier, une période, etc. Et comme les éléments sont conservés en mémoire, les objets ne sont pas sérialisés. désérialisé, 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.

J'utilise une collection statique en tant que domaine privé avec une propriété statique publique qui la charge ou la récupère depuis la base de données.

De plus, vous pouvez ajouter une date / heure statique qui est définie lorsqu’elle est chargée et, si vous l’appelez, au bout d’un certain temps, effacez la collection statique et extrayez-la à nouveau.

La mise en cache est la voie à suivre. Et si vous aimez les modèles, jetez un coup d’œil au singleton.

Mais dans l’ensemble, je ne suis pas sûr de m'en inquiéter tant que vous ne remarquerez pas une dégradation des performances.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top