2008-09-15 2 views
2

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

+0

私は十分な担当者が「キャッシング」とタグを付けるべきだとお勧めします。 – rohancragg

答えて

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

は今、あなたは、プロジェクトの残りの部分であなたのリストにアクセスすることができます。

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

コードサンプルの良いソリューション - 乾杯。私はこれが本当に私が探しているものに近いと言うでしょう。 – Mike

0

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

また、読み込まれたときに設定された静的な日時を追加したり、一定の時間が経過してから呼び出すと、静的なコレクションをクリアして再度クエリを実行したりすることができます。

1

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

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

+0

良い点。データは変更される可能性があります。その質問ではデータが明確ではないため、更新しました。ごめんなさい。 – Mike

1

すべてを取得するのは高価な場合があります。 lazy initを試して、要求データだけを取り出し、それをキャッシュ変数に格納してください。

1

早すぎる最適化は悪です。つまり、アプリケーションにパフォーマンスの問題があり、ユーザーに表示する静的な情報がある場合は、そのデータをアレイに一度ロードしてアプリケーションオブジェクトに格納することができます。メモリ使用量と最適化とのバランスを慎重にしたいと思っています。

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

+0

素晴らしいポイント!現在、問題はありません。私は、セッションが速くなるとボトルネックを探すことを嗅覚しています - 別名slashdot/digg/redditエフェクト。リロードの問題は、それ自体別の問題かもしれません。 – Mike

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); 
1

私はアプリケーションキャッシュ(キャッシュオブジェクト)にデータを格納することになる。

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

およびコードビハインドファイルに:例えば、Default.aspxの中のDropDownListの値をロードします。そして、私はそれをプリロードしません、私はそれが要求されたときに初めてロードします。キャッシュについてうれしいのは、そのASPです。NETはそれを管理します。これは、ファイルの変更や期間の経過後にキャッシュエントリを期限切れにするオプションを与えることを含みます。アイテムはメモリに保持されるため、オブジェクトはシリアライズ/デシリアライズされず、使用が非常に高速になります。

使い方は簡単です。 CacheオブジェクトにGetメソッドとAddメソッドがあり、それぞれアイテムを取得してキャッシュに追加します。

+0

Jeff - 素晴らしい提案。私はページ上の他のすべてがダイナミックでヘッダーさえあるので、Webキャッシングに関するいくつかの問題がありました。毎回新鮮なコピーが欲しいので、私はそれから離れていたので、私はアプリのルートが好きです。いずれにせよ、1ヶ月に1回、便利なリフレッシュ可能性が最も良い。 – Mike

0

キャッシングは方法です。そして、あなたがデザインパターンに入るなら、シングルトンを見てください。

しかし、全体的にはパフォーマンスの低下に気づくまでは心配していません。

関連する問題