2008-09-15 5 views
2

웹 응용 프로그램에서 탐색 할 범주 목록이 있다고 가정 해 봅니다. evey 사용자를 위해 데이터베이스에서 선택하는 대신 global.asax의 application_onStart에 함수 호출을 추가하여 반복적으로 다시 사용되는 배열이나 컬렉션으로 해당 데이터를 가져와야합니다. 내 데이터가 전혀 변경되지 않는 경우 - (편집 - 매우 자주) 이것이 최선의 방법일까요?.net 웹 응용 프로그램에서 많이 사용되는 데이터를로드하는 가장 좋은 방법은 무엇입니까

+0

충분한 인원이있는 사람이 '캐싱'으로 태그를 지정해야합니다. – rohancragg

답변

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

이제 프로젝트의 나머지 목록에 액세스 할 수 있습니다.

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

좋은 샘플 코드 샘플 - 건배. 나는 이것이 내가 찾고있는 것에 가깝다고 말한다. – Mike

0

데이터베이스에서로드하거나 가져 오는 public static 속성을 사용하여 정적 컬렉션을 개인용으로 사용합니다.

또한로드 될 때 설정되는 정적 날짜 시간을 추가 할 수 있습니다. 일정 시간이 지나면 일정 기간이 지나면 정적 컬렉션을 지우고 다시 쿼리 할 수 ​​있습니다.

1

변경되지 않으면 데이터베이스에있을 필요는 없습니다.

데이터가 많지 않은 경우 web.config 또는 코드의 enum 열에 넣을 수 있습니다.

+0

좋은 지적입니다. 데이터가 변경 될 수 있으며 그 질문에 대해 명확하지 않았습니다. 따라서 업데이트했습니다. 죄송합니다. – Mike

1

모두 가져 오기가 비용이 많이들 수 있습니다. lazy init을 시도하고 요청 데이터 만 가져온 다음 캐시 변수에 저장하십시오.

1

조숙 한 최적화는 악합니다. 즉, 응용 프로그램에 성능 문제가 있고 사용자에게 표시하려는 "정적"정보가있는 경우 해당 데이터를 배열에 한 번로드하고 Application Object에 저장할 수 있습니다. 메모리 사용과 최적화를 조심하고 균형을 유지하려고합니다.

다음으로 실행되는 문제는 데이터베이스에 저장된 정보를 변경하고 캐시 된 버전을 업데이트하지 않는 것입니다. 캐시 된 데이터와 함께 상태에 저장하는 데이터베이스에서 마지막으로 변경된 날짜를 원할 수 있습니다. 그렇게하면 가장 많이 변경된 시간을 쿼리하고 비교할 수 있습니다. 캐시 된 날짜보다 최신 날짜이면 덤프하고 다시로드하십시오.

+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

나는 응용 프로그램 캐시 (Cache 개체)에 데이터를 저장하는 것입니다 :

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

을 그리고 코드 숨김 파일에서 예를 들어, Default.aspx를에있는 DropDownList의 값을로드 . 그리고 나는 그것을 미리로드하지 않을 것이고, 그것이 요청 될 때 처음로드 할 것입니다. 캐시에 대한 좋은 점은 ASP입니다.NET은 파일 변경, 기간 후 캐시 항목 만료 옵션을 제공하는 등 사용자를 관리합니다. 항목이 메모리에 보관되므로 객체가 직렬화/직렬화되지 않아 사용량이 매우 빠릅니다.

사용법은 간단합니다. Cache 개체에 Get 및 Add 메서드가있어 각각 캐시에 항목을 검색하고 추가합니다.

+0

Jeff - 위대한 제안. 나는 페이지의 다른 모든 것이 동적이기 때문에 웹 캐싱에 몇 가지 문제가있다. 심지어 헤더. 나는 매번 새로운 사본을 원하기 때문에 그만 뒀다. 그래서 나는 앱 루트를 좋아한다. 어느 것이 든 한 달에 한 번 편리함을 제공하는 것이 가장 좋습니다. – Mike

0

캐싱이 좋습니다. 디자인 패턴에 익숙하다면 싱글 톤을 살펴보십시오.

전반적으로 성능 저하가 발생할 때까지는 걱정할 필요가 없습니다.