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

问题描述:

假设我有一个用于在Web应用程序上导航的类别列表。我应该在global.asax的application_onStart中添加一个函数调用,以将数据提取到一个数组或集合中,并且一遍又一遍地重复使用,而不是从数据库中为evey用户选择。如果我的数据根本没有改变 - (经常编辑),这是最好的方法吗?在.net Web应用程序中加载高度重用数据的最佳方式是什么

+0

我建议有足够代表的人应该用'缓存'标记这个...... – rohancragg 2008-09-15 16:13:17

可以存储在应用程序对象的列表项。您对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); 
} 
+0

代码示例的好方案 - 欢呼声。我会说这是真正接近我所寻找的。 – Mike 2008-09-15 18:56:14

我使用一个静态集合作为一个私有的公共静态属性,可以从数据库加载或获取它。

此外,您可以添加,当它被加载时设置一个静态的日期时间,如果你要求它,过去一段时间,清除静电收集和重新查询它。

如果它永不改变,它可能不需要在数据库中。

如果没有太多的数据,你可以把它放在web.config中,或者在你的代码中使用en Enum。

+0

好点。数据可能会改变,我不清楚这个问题,所以我已经更新了它。抱歉。 – Mike 2008-09-15 18:38:58

提取所有可能是昂贵的。尝试惰性init,只提取请求数据,然后将其存储在缓存变量中。

不成熟的优化是邪恶的。这是一个给定的问题,如果您的应用程序出现性能问题,并且您想要向用户显示“静态”信息,那么您肯定可以将该数据加载到数组中并将其存储在应用程序对象中。您要谨慎并通过优化来平衡内存使用情况。

您遇到的问题是更改数据库存储的信息,而不是更新缓存的版本。您可能希望在数据库中存储某种类型的最后更改日期,这些数据与缓存数据一起以状态存储。这样你可以查询最大的变化时间并进行比较。如果它比你的缓存日期更新,那么你将它转储并重新加载。

+0

真棒点!目前没有问题。当会话快速提升时,我在四处寻找瓶颈 - 也就是slashdot/digg/reddit效果。重装问题本身可能是另一个问题。 – Mike 2008-09-15 18:42:34

在应用程序变量中。

请记住,一个应用程序变量可以包含在.net中的对象,这样你就可以在Global.asax实例化对象,然后直接在代码中使用它。

由于应用程序变量是在内存中它们是非常快(VS不必调用数据库)

例如:

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

我将存储在应用程序的高速缓存(Cache对象)的数据。我不会预加载它,我会在第一次请求时加载它。什么是高速缓存的好处是ASP。NET将管理它,包括给你在文件更改,时间段等后到期缓存条目的选项。由于项目保存在内存中,因此对象不会被序列化/反序列化,所以用法非常快。

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

+0

杰夫 - 伟大的建议。我有一些网页缓存问题,因为网页上的其他内容都是动态的,甚至是标题。由于我每次都需要一份新的副本,所以我一直保持这种状态,所以我喜欢应用程序路线。无论哪个人提供一次一次的方便刷新性是最好的。 – Mike 2008-09-15 18:52:38

缓存是要走的路。如果你的设计模式,看看单身。

总体而言,我不确定我会担心它,直到您注意到性能下降。