2008-09-15 78 views
2

假設我有一個用於在Web應用程序上導航的類別列表。我應該在global.asax的application_onStart中添加一個函數調用,以將數據提取到一個數組或集合中,並且一遍又一遍地重複使用,而不是從數據庫中爲evey用戶選擇。如果我的數據根本沒有改變 - (經常編輯),這是最好的方法嗎?在.net Web應用程序中加載高度重用數據的最佳方式是什麼

+0

我建議有足夠代表的人應該用'緩存'標記這個...... – rohancragg 2008-09-15 16:13:17

回答

2

可以存儲在應用程序對象的列表項。您對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

0

我使用一個靜態集合作爲一個私有的公共靜態屬性,可以從數據庫加載或獲取它。

此外,您可以添加,當它被加載時設置一個靜態的日期時間,如果你要求它,過去一段時間,清除靜電收集和重新查詢它。

1

如果它永不改變,它可能不需要在數據庫中。

如果沒有太多的數據,你可以把它放在web.config中,或者在你的代碼中使用en Enum。

+0

好點。數據可能會改變,我不清楚這個問題,所以我已經更新了它。抱歉。 – Mike 2008-09-15 18:38:58

1

提取所有可能是昂貴的。嘗試惰性init,只提取請求數據,然後將其存儲在緩存變量中。

1

不成熟的優化是邪惡的。這是一個給定的問題,如果您的應用程序出現性能問題,並且您想要向用戶顯示「靜態」信息,那麼您肯定可以將該數據加載到數組中並將其存儲在應用程序對象中。您要謹慎並通過優化來平衡內存使用情況。

您遇到的問題是更改數據庫存儲的信息,而不是更新緩存的版本。您可能希望在數據庫中存儲某種類型的最後更改日期,這些數據與緩存數據一起以狀態存儲。這樣你可以查詢最大的變化時間並進行比較。如果它比你的緩存日期更新,那麼你將它轉儲並重新加載。

+0

真棒點!目前沒有問題。當會話快速提升時,我在四處尋找瓶頸 - 也就是slashdot/digg/reddit效果。重裝問題本身可能是另一個問題。 – Mike 2008-09-15 18:42:34

1

在應用程序變量中。

請記住,一個應用程序變量可以包含在.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); 
1

我將存儲在應用程序的高速緩存(Cache對象)的數據。我不會預加載它,我會在第一次請求時加載它。什麼是高速緩存的好處是ASP。NET將管理它,包括給你在文件更改,時間段等後到期緩存條目的選項。由於項目保存在內存中,因此對象不會被序列化/反序列化,所以用法非常快。

用法很簡單。 Cache對象上有Get和Add方法分別檢索項目並將其添加到緩存中。

+0

傑夫 - 偉大的建議。我有一些網頁緩存問題,因爲網頁上的其他內容都是動態的,甚至是標題。由於我每次都需要一份新的副本,所以我一直保持這種狀態,所以我喜歡應用程序路線。無論哪個人提供一次一次的方便刷新性是最好的。 – Mike 2008-09-15 18:52:38

0

緩存是要走的路。如果你的設計模式,看看單身。

總體而言,我不確定我會擔心它,直到您注意到性能下降。

相關問題