在.net Web应用程序中加载高度重复使用的数据的最佳方法是什么

时间:2020-03-05 18:53:50  来源:igfitidea点击:

假设我有一个Web应用程序上的导航类别列表。我应该从global.asax的application_onStart中添加一个函数调用,而不是从数据库中选择适合evey用户的用户,以将该数据获取到反复使用的数组或者集合中。如果我的数据完全不变(经常编辑),这是最好的方法吗?

解决方案

回答

我将静态集合用作具有公共静态属性的私有集合,该公共静态属性可以从数据库加载或者获取它。

另外,我们可以添加一个静态日期时间,该日期时间在加载时设置,如果需要,则在一定时间后清除静态集合并重新查询。

回答

如果它从不改变,则可能不必将其保存在数据库中。

如果没有太多数据,则可以将其放在web.config中,或者在代码中将其作为枚举。

回答

全部获取可能很昂贵。尝试延迟初始化,仅获取请求数据,然后将其存储在缓存变量中。

回答

过早的优化是邪恶的。顺带一提,如果应用程序遇到性能问题,并且要向用户显示"静态"信息,则可以将数据一次性加载到数组中并将其存储在Application Object中。我们需要注意并在内存使用与优化之间取得平衡。

然后我们遇到的问题是更改数据库存储的信息,而没有更新缓存的版本。我们可能希望将某种状态的最后更改日期与高速缓存的数据一起存储在状态数据库中。这样,我们可以查询最大的更改时间并进行比较。如果它比缓存日期新,则将其转储并重新加载。

回答

在应用程序变量中。

请记住,应用程序变量可以包含.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);

回答

我们可以将列表项存储在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);
}

回答

我会将数据存储在应用程序缓存(缓存对象)中。而且我不会预加载它,而是在第一次请求时加载它。缓存的优点在于ASP.NET将对其进行管理,包括为我们提供在文件更改,时间段等之后使缓存条目到期的选项。由于这些项都保存在内存中,因此对象不会被序列化/反序列化,因此使用非常快。

用法很简单。 Cache对象上有Get和Add方法,分别用于检索和添加项目到缓存。

回答

缓存是必经之路。如果我们喜欢设计模式,请看一下单例。

总体而言,在我们发现性能下降之前,我不确定是否会为此担心。