DevExpress eXpressApp Framework (XAF) e eXpress Persistent Objects (XPO):como faço para acelerar o tempo de carregamento das associações?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou tendo um problema com a velocidade de acesso a uma propriedade de associação com grande quantidade de registros.

Eu tenho um aplicativo XAF com uma classe pai chamada MyParent.

Existem 230 registros em MyParent.

MyParent tem uma classe filha chamada MyChild.

Existem 49.000 registros em MyChild.

Eu tenho uma associação definida entre MyParent e MyChild da maneira padrão:

Em MyChild:

// MyChild (many) and MyParent (one)
[Association("MyChild-MyParent")]
public MyParent MyParent;

E em MyParent:

[Association("MyChild-MyParent", typeof(MyChild))]
public XPCollection<MyCHild> MyCHildren
{
     get { return GetCollection<MyCHild>("MyCHildren"); }
}

Há um específico MyParent registro chamado MyParent1.

Para MyParent1, existem 630 MyChild registros.

Eu tenho um DetailView para uma classe chamada MyUI.

O usuário escolhe um item em um menu suspenso na MyUI DetailView, e meu código precisa preencher outro menu suspenso com MyChild objetos.

O usuário escolhe MyParent1 no primeiro menu suspenso.

Criei uma propriedade em MyUI devolver a coleção de MyChild objetos para o valor selecionado no primeiro menu suspenso.

Aqui está o código da propriedade:

[NonPersistent]
public XPCollection<MyChild> DisplayedValues
{
    get
    {
        Session theSession;
        MyParent theParentValue;
        XPCollection<MyCHild> theChildren;

        theParentValue = this.DropDownOne;
        // get the parent value

        if theValue == null)
        {
            // if none

            return null;
            // return null
        }

        theChildren = theParentValue.MyChildren;
        // get the child values for the parent

        return theChildren;
        // return it
    }

Eu marquei o DisplayedValues propriedade como NonPersistent porque é necessário apenas para a UI do DetailVIew.Não acho que persistir irá acelerar a criação da coleção na primeira vez, e depois de usado para preencher o menu suspenso, não preciso dele, então não quero perder tempo armazenando-o.

O problema é que leva 45 segundos para ligar theParentValue = this.DropDownOne.

Especificações:

  • Vista Business
  • 8 GB de RAM
  • Processador E6550 de 2,33 GHz
  • Servidor SQL Expresso 2005

Isso é muito longo para os usuários esperarem por um dos muitos menus suspensos no DetailView.

Reservei um tempo para esboçar o caso de negócios porque tenho duas perguntas:

  1. Como posso fazer com que os valores associados sejam carregados mais rapidamente?

  2. Existe outra maneira (simples) de programar os menus suspensos e o DetailView que é executado muito mais rápido?

Sim, você pode dizer que 630 são itens demais para serem exibidos em um menu suspenso, mas esse código está demorando tanto que suspeito que a velocidade seja proporcional a 49.000 e não a 630.100 itens no menu suspenso não seriam demais para meu aplicativo.

Preciso de alguns desses menus suspensos em meu aplicativo, por isso não é apropriado forçar o usuário a inserir critérios de filtragem mais complicados para cada um deles.O usuário precisa escolher um valor e ver os valores relacionados.

Eu entenderia se encontrar um grande número de registros fosse lento, mas encontrar algumas centenas não deveria demorar tanto.

Foi útil?

Solução

Em primeiro lugar, você está certo em ser cético de que esta operação demore tanto, XPO em operações de leitura deve adicionar apenas entre 30 a 70% de sobrecarga, e nesta pequena quantidade de dados deveríamos estar falando de milissegundos e não de segundos.

Algumas dicas gerais de desempenho estão disponíveis nos fóruns do DevExpress e giram em torno de cache de objetos, cargas lentas versus cargas profundas, etc., mas acho que no seu caso o problema é outra coisa, infelizmente é muito difícil adivinhar o que está acontecendo com sua pergunta, apenas para dizer, é altamente improvável que seja um problema com o XPO, muito mais provável que seja outra coisa, eu estaria inclinado a olhar para a criação da sua sessão (isso também cria o cache do objeto) e o código de conexão SQL (o material IDataStore). geralmente lento se os hosts não puderem ser resolvidos de forma limpa e se você não estiver agrupando/reutilizando conexões, esse problema pode ser agravado.

Outras dicas

Não sei por que você faria isso do jeito que está.Se você criou uma associação como esta:

public class A : XPObject
{
    [Association("a<b", typeof(b))]
    public XPCollection<b> bs { get { GetCollection("bs"); } }
}

public class B : XPObject
{
    [Association("a<b") Persistent("Aid")]
    public A a { get; set; }
}

então, quando você quiser preencher um menu suspenso (como um controle lookupEdit)

A myA = GetSomeParticularA();
lupAsBs.Properties.DataSource = myA.Bs;
lupAsBs.Properties.DisplayMember = "WhateverPropertyName";

Você não precisa carregar os filhos de A, o XPO os carregará conforme necessário e não há nenhum gerenciamento de sessão necessário para isso.

Obrigado pela resposta.Criei uma solução separada e consegui um bom desempenho, como você sugere.

Minha conexão SQL está OK e funciona com outros recursos do aplicativo.

Dado que estou usando o XAF e não estou fazendo nada extra/extravagante, minhas sessões não são gerenciadas pelo XAF?

A sessão que uso é lida no DetailView.

Não tenho certeza sobre o seu caso, só quero compartilhar algumas das minhas experiências com o XAF.

Na primeira vez que você clicar em um controle suspenso (lista de pesquisa) (em uma visualização detalhada), duas consultas serão enviadas ao banco de dados para preencher a lista.Em meus testes, às vezes o objeto inteiro é carregado na coleção de origem, não apenas as propriedades ID e Nome, como pensamos, então depende de seus objetos, você pode querer usar objetos mais leves para listas.Você também pode ativar o Modo Servidor da lista e apenas 128 objetos serão carregados por vez.

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