Qual é a melhor maneira de carregar dados altamente reutilizados em um aplicativo da web .net

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Digamos que eu tenha uma lista de categorias para navegação em um aplicativo web.Em vez de selecionar no banco de dados para cada usuário, devo adicionar uma chamada de função no application_onStart do global.asax para buscar esses dados em uma matriz ou coleção que é reutilizada continuamente.Se meus dados não mudarem nada - (Editar - com muita frequência), esse seria o melhor caminho?

Foi útil?

Solução

Você pode armazenar os itens da lista no objeto Aplicativo.Você está certo sobre o application_onStart(), basta chamar um método que irá ler seu banco de dados e carregar os dados no objeto Application.

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

Agora você pode acessar sua lista no restante do projeto.Por exemplo, em default.aspx para carregar os valores em um DropDownList:

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

E no arquivo code-behind:

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

Outras dicas

Se nunca mudar, provavelmente não precisará estar no banco de dados.

Se não houver muitos dados, você pode colocá-los no web.config ou como en Enum no seu código.

Buscar tudo pode ser caro.Experimente o lazy init, busque apenas os dados solicitados e armazene-os na variável de cache.

A otimização prematura é má.Sendo isso um dado adquirido, se você estiver tendo problemas de desempenho em seu aplicativo e tiver informações "estáticas" que deseja exibir aos seus usuários, você pode definitivamente carregar esses dados uma vez em uma matriz e armazená-los no objeto de aplicativo.Você quer ter cuidado e equilibrar o uso de memória com otimização.

O problema que você enfrenta é alterar as informações armazenadas no banco de dados e não fazer com que ele atualize a versão em cache.Você provavelmente gostaria de ter algum tipo de data da última alteração no banco de dados que você armazena no estado junto com os dados em cache.Dessa forma, você pode consultar o horário de maior alteração e compará-lo.Se for mais recente que a data em cache, você descarta e recarrega.

Em uma variável de aplicativo.

Lembre-se que uma variável de aplicação pode conter um objeto em .Net, então você pode instanciar o objeto no global.asax e depois utilizá-lo diretamente no código.

Como as variáveis ​​do aplicativo estão na memória, elas são muito rápidas (em vez de precisar chamar um banco de dados)

Por exemplo:

// Create and load the profile object
x_siteprofile thisprofile = new x_siteprofile(Server.MapPath(String.Concat(config.Path, "templates/")));
Application.Add("SiteProfileX", thisprofile);

Eu armazenaria os dados no Cache do Aplicativo (objeto Cache).E eu não o pré-carregaria, eu o carregaria na primeira vez que fosse solicitado.O que é interessante sobre o cache é que o ASP.NET irá gerenciá-lo, incluindo opções para expirar a entrada do cache após alterações no arquivo, um período de tempo, etc.E como os itens são mantidos na memória, os objetos não são serializados/desserializados, portanto o uso é muito rápido.

O uso é simples.Existem métodos Get e Add no objeto Cache para recuperar e adicionar itens ao cache, respectivamente.

Eu uso uma coleção estática como privada com uma propriedade estática pública que a carrega ou obtém do banco de dados.

Além disso, você pode adicionar uma data e hora estática que é definida quando é carregada e, se você solicitar, após um determinado período de tempo, limpe a coleção estática e consulte-a novamente.

O cache é o caminho a percorrer.E se você gosta de padrões de design, dê uma olhada no singleton.

No geral, porém, não tenho certeza se ficaria preocupado com isso até você notar degradação no desempenho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top