1

Web アプリのナビゲーション用のカテゴリのリストがあるとします。ユーザーごとにデータベースから選択するのではなく、global.asax の application_onStart に関数呼び出しを追加して、そのデータを繰り返し再利用される配列またはコレクションにフェッチする必要があります。データがまったく変更されない場合 (編集 - 非常に頻繁に)、これが最善の方法でしょうか?

4

8 に答える 8

2

リスト項目は 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);
}
于 2008-09-15T17:17:08.010 に答える
2

時期尚早の最適化は悪です。アプリケーションにパフォーマンス上の問題があり、ユーザーに表示したい「静的」情報がある場合は、そのデータを一度配列にロードして Application オブジェクトに格納することができます。注意して、メモリ使用量と最適化のバランスを取る必要があります。

そのときに発生する問題は、データベースに保存された情報を変更し、キャッシュされたバージョンを更新しないことです。おそらく、キャッシュされたデータとともに状態に保存するデータベースに、ある種の最終変更日が必要になるでしょう。そうすれば、最大の変更時間を照会して比較できます。キャッシュされた日付よりも新しい場合は、ダンプしてリロードします。

于 2008-09-15T16:18:54.013 に答える
1

データをアプリケーション キャッシュ (キャッシュ オブジェクト) に保存します。事前にロードするのではなく、最初に要求されたときにロードします。キャッシュの優れている点は、ASP.NET がそれを管理し、ファイルの変更後にキャッシュ エントリを期限切れにするオプションや期間などを提供することです。また、アイテムはメモリに保持されるため、オブジェクトはシリアル化されません。逆シリアル化されているため、使用は非常に高速です。

使い方は簡単です。Cache オブジェクトには、項目を取得してキャッシュに追加するための Get メソッドと Add メソッドがあります。

于 2008-09-15T17:28:15.720 に答える
1

変更されない場合は、おそらくデータベースに存在する必要はありません。

データがあまりない場合は、web.config に入れるか、コードの en Enum として入れることができます。

于 2008-09-15T16:13:59.953 に答える
1

すべてをフェッチするとコストがかかる場合があります。lazy init を試して、リクエスト データのみをフェッチしてから、キャッシュ変数に格納します。

于 2008-09-15T16:16:53.753 に答える
1

アプリケーション変数。

アプリケーション変数には .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);
于 2008-09-15T16:18:58.477 に答える
0

データベースからロードまたは取得するパブリック静的プロパティを使用して、静的コレクションをプライベートとして使用します。

さらに、ロードされたときに設定される静的な日時を追加し、それを呼び出した場合、一定の時間が経過したら、静的コレクションをクリアして再クエリすることができます。

于 2008-09-15T16:12:35.603 に答える
0

キャッシングは行く方法です。また、デザイン パターンに興味がある場合は、シングルトンを見てください。

全体的には、パフォーマンスの低下に気付くまで、私はそれについて心配するかどうかはわかりません.

于 2008-09-15T17:31:28.927 に答える