Каков наилучший способ загрузки повторно используемых данных в веб-приложении.net?

Допустим, у меня есть список категорий для навигации в веб-приложении. Вместо того, чтобы выбирать из базы данных пользователя evey, я должен добавить вызов функции в application_onStart файла global.asax для извлечения этих данных в массив или коллекцию, которая используется снова и снова. Если мои данные не меняются вообще - (Редактировать - очень часто), это будет лучшим способом?

8 ответов

Решение

Вы можете сохранить элементы списка в объекте Application. Вы правы насчет application_onStart()просто вызовите метод, который будет читать вашу базу данных и загружать данные в объект Application.

В 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;
    }
 }

Теперь вы можете получить доступ к вашему списку в остальной части проекта. Например, в default.aspx для загрузки значений в DropDownList:

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

И в файле с выделенным кодом:

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

Преждевременная оптимизация - это зло. Это само собой разумеющееся, если у вас есть проблемы с производительностью в вашем приложении, и у вас есть "статическая" информация, которую вы хотите отобразить пользователям, вы определенно можете загрузить эти данные один раз в массив и сохранить их в объекте приложения. Вы хотите быть осторожным и сбалансировать использование памяти с оптимизацией.

Проблема, с которой вы столкнулись, заключается в изменении сохраненной в базе данных информации и отсутствии необходимости обновлять кэшированную версию. Возможно, вы захотите иметь какую-то дату последнего изменения в базе данных, которую вы храните в состоянии вместе с кэшированными данными. Таким образом, вы можете запросить самое измененное время и сравнить его. Если она новее, чем ваша кэшированная дата, вы ее сбрасываете и перезагружаете.

В переменной приложения.

Помните, что переменная приложения может содержать объект в.Net, поэтому вы можете создать экземпляр объекта в global.asax и затем использовать его непосредственно в коде.

Поскольку переменные приложения находятся в памяти, они очень быстрые (против вызова базы данных)

Например:

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

Если он никогда не изменяется, он, вероятно, не должен быть в базе данных.

Если данных мало, вы можете поместить их в файл web.config или как en enum в своем коде.

Извлечение всего может быть дорогим. Попробуйте lazy init, получите только данные запроса и сохраните их в переменной кэша.

Я хотел бы хранить данные в кэше приложений (объект кэша). И я бы не стал предварительно загружать его, я бы загружал его при первом запросе. Что хорошо в Cache, так это то, что ASP.NET будет управлять им, в том числе предоставляя вам варианты для истечения срока действия записи в кэше после изменения файла, периода времени и т. Д. А поскольку элементы хранятся в памяти, объекты не сериализуются / десериализован, поэтому использование очень быстро.

Использование просто. Существуют методы Get и Add для объекта Cache для извлечения и добавления элементов в кэш соответственно.

Кэширование - это путь. А если вы увлекаетесь дизайном, взгляните на синглтон.

В целом, однако, я не уверен, что буду беспокоиться об этом, пока вы не заметите снижение производительности.

Я использую статическую коллекцию как частную с открытым статическим свойством, которое либо загружает, либо получает ее из базы данных.

Кроме того, вы можете добавить статическое время и дату, которое устанавливается при загрузке, и, если вы вызываете его, по прошествии определенного времени, очистить статическую коллекцию и запросить ее.

Другие вопросы по тегам