DevExpress eXpressApp Framework (XAF) ed eXpress Persistent Objects (XPO):come posso velocizzare il tempo di caricamento delle associazioni?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Sto riscontrando un problema con la velocità di accesso alla proprietà di un'associazione con un numero elevato di record.

Ho un'app XAF con una classe genitore chiamata MyParent.

Sono presenti 230 record MyParent.

MyParent ha una classe figlia chiamata MyChild.

Ci sono 49.000 record MyChild.

Ho un'associazione definita tra MyParent E MyChild nel modo standard:

In MyChild:

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

E dentro MyParent:

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

C'è uno specifico MyParent record chiamato MyParent1.

Per MyParent1, sono 630 MyChild record.

Ho un DetailView per una classe chiamata MyUI.

L'utente sceglie un elemento in un menu a discesa nel file MyUI DetailView e il mio codice deve riempire un altro menu a discesa MyChild oggetti.

L'utente sceglie MyParent1 nel primo menu a discesa.

Ho creato una proprietà in MyUI restituire la collezione di MyChild oggetti per il valore selezionato nel primo menu a discesa.

Ecco il codice dell'immobile:

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

Ho segnato il DisplayedValues proprietà come NonPersistent perché è necessario solo per l'interfaccia utente di DetailView.Non penso che persistere accelererà la creazione della raccolta la prima volta e, dopo averlo utilizzato per riempire il menu a discesa, non ne ho bisogno, quindi non voglio perdere tempo a memorizzarlo.

Il problema è che ci vogliono 45 secondi per chiamare theParentValue = this.DropDownOne.

Specifiche:

  • Vista Affari
  • 8 GB di RAM
  • Processore E6550 da 2,33 GHz
  • SQL Server Express 2005

Questo è troppo lungo perché gli utenti possano attendere uno dei tanti menu a discesa in DetailView.

Mi sono preso il tempo per abbozzare il business case perché ho due domande:

  1. Come posso velocizzare il caricamento dei valori associati?

  2. Esiste un altro (semplice) modo per programmare i menu a discesa e DetailView che funzioni molto più velocemente?

Sì, puoi dire che 630 sono troppi elementi da visualizzare in un menu a discesa, ma questo codice impiega così tanto tempo che sospetto che la velocità sia proporzionale a 49.000 e non a 630.100 elementi nel menu a discesa non sarebbero troppi per la mia app.

Ho bisogno di alcuni di questi menu a discesa nella mia app, quindi non è appropriato forzare l'utente a inserire criteri di filtro più complicati per ciascuno di essi.L'utente deve scegliere un valore e vedere i valori correlati.

Capirei se trovare un gran numero di record fosse lento, ma trovarne alcune centinaia non dovrebbe richiedere così tanto tempo.

È stato utile?

Soluzione

In primo luogo hai ragione a essere scettico sul fatto che questa operazione dovrebbe richiedere così tanto tempo, XPO sulle operazioni di lettura dovrebbe aggiungere solo tra il 30 e il 70% di sovraccarico e su questa piccola quantità di dati dovremmo parlare di millisecondi e non di secondi.

Alcuni suggerimenti generali sulle prestazioni sono disponibili nei forum DevExpress e sono incentrati sulla memorizzazione nella cache degli oggetti, sui carichi lenti e profondi, ecc., Ma penso che nel tuo caso il problema sia qualcos'altro, sfortunatamente è molto difficile indovinare cosa sta succedendo dalla tua domanda, solo per dire, è altamente improbabile che sia un problema con XPO, molto più probabile che sia qualcos'altro, sarei propenso a guardare la creazione della sessione (questo crea anche la cache degli oggetti) e il codice di connessione SQL (il materiale IDataStore), le connessioni sono spesso lento se gli host non possono essere risolti in modo pulito e se non si raggruppano/riutilizzano le connessioni questo problema può essere esacerbato.

Altri suggerimenti

Non sono sicuro del motivo per cui lo faresti nel modo in cui sei.Se hai creato un'associazione come questa:

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

quindi quando vuoi popolare un menu a discesa (come un controllo lookupEdit)

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

Non è necessario caricare i figli di A, XPO li caricherà quando necessario e non è necessaria alcuna gestione della sessione per questo.

Grazie per la risposta.Ho creato una soluzione separata e sono riuscito a ottenere buone prestazioni, come suggerisci.

La mia connessione SQL è OK e funziona con altre funzionalità dell'app.

Dato che sto utilizzando XAF e non sto facendo nulla di extra/stravagante, le mie sessioni non sono gestite da XAF?

La sessione che utilizzo viene letta da DetailView.

Non sono sicuro del tuo caso, voglio solo condividere alcune delle mie esperienze con XAF.

La prima volta che si fa clic su un controllo a discesa (elenco di ricerca) (in una visualizzazione dettagliata), verranno inviate due query al database per popolare l'elenco.Nei miei test, a volte l'intero oggetto viene caricato nella raccolta di origine, non solo le proprietà ID e Nome come pensavamo, quindi dipende dai tuoi oggetti che potresti voler utilizzare quelli più leggeri per gli elenchi.È inoltre possibile attivare la modalità server dell'elenco, quindi verranno caricati solo 128 oggetti ogni volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top