.net 웹 애플리케이션에서 재사용률이 높은 데이터를 로드하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/64284

  •  09-06-2019
  •  | 
  •  

문제

웹 앱 탐색을 위한 카테고리 목록이 있다고 가정해 보겠습니다.모든 사용자를 위해 데이터베이스에서 선택하는 대신 global.asax의 application_onStart에 함수 호출을 추가하여 해당 데이터를 반복적으로 재사용되는 배열이나 컬렉션으로 가져와야 합니다.내 데이터가 전혀 변경되지 않는 경우(편집 - 매우 자주) 이것이 최선의 방법일까요?

도움이 되었습니까?

해결책

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

다른 팁

변경되지 않는 경우에는 데이터베이스에 있을 필요가 없을 것입니다.

데이터가 많지 않으면 web.config에 넣거나 코드에 Enum으로 넣을 수 있습니다.

모두 가져오는 데 비용이 많이 들 수 있습니다.지연 초기화를 시도하고 요청 데이터만 가져온 다음 캐시 변수에 저장하세요.

성급한 최적화는 악입니다.당연한 말이지만, 애플리케이션에 성능 문제가 있고 사용자에게 표시하려는 "정적" 정보가 있는 경우 해당 데이터를 배열로 한 번 로드한 다음 애플리케이션 개체에 저장할 수 있습니다.주의를 기울여 최적화와 메모리 사용량의 균형을 맞추고 싶습니다.

그때 직면하는 문제는 데이터베이스에 저장된 정보를 변경하고 캐시된 버전을 업데이트하지 않는 것입니다.캐시된 데이터와 함께 상태에 저장하는 데이터베이스에 일종의 마지막 변경 날짜를 갖고 싶을 수도 있습니다.이렇게 하면 가장 많이 변경된 시간을 쿼리하고 비교할 수 있습니다.캐시된 날짜보다 최신인 경우 해당 날짜를 덤프하고 다시 로드합니다.

응용 프로그램 변수에서.

애플리케이션 변수에는 .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);

저는 애플리케이션 캐시(캐시 개체)에 데이터를 저장하겠습니다.그리고 미리 로드하지 않고 처음 요청될 때 로드합니다.캐시의 좋은 점은 파일 변경 후 캐시 항목 만료 옵션, 기간 등을 제공하는 것을 포함하여 ASP.NET이 캐시를 관리한다는 것입니다.그리고 항목이 메모리에 보관되므로 개체가 직렬화/역직렬화되지 않으므로 사용이 매우 빠릅니다.

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

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

또한 로드될 때 설정되는 정적 날짜/시간을 추가할 수 있으며, 이를 호출하면 특정 시간이 지나면 정적 컬렉션을 지우고 다시 쿼리할 수 있습니다.

캐싱이 좋은 방법입니다.디자인 패턴에 관심이 있다면 싱글톤을 살펴보세요.

그러나 전반적으로 성능 저하가 눈에 띄기 전까지는 걱정할 수 있을지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top