DevExpress eXpressApp Framework (XAF) und eXpress Persistent Objects (XPO): Wie beschleunigen ich die Ladezeit von Assoziationen?

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

  •  09-06-2019
  •  | 
  •  

Frage

ich habe ein Problem mit der Geschwindigkeit mit einer großen Anzahl von Datensätzen eine Assoziation Eigenschaft zuzugreifen.

Ich habe einen XAF-App mit einer übergeordneten Klasse namens MyParent.

Es gibt 230 Datensätze in MyParent.

MyParent hat ein Kind Klasse namens MyChild.

Es gibt 49.000 Datensätze in MyChild.

Ich habe eine Assoziation zwischen MyParent und MyChild im Standard definiert:

In MyChild:

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

Und in MyParent:

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

Es gibt eine spezifische MyParent Datensatz genannt MyParent1.

Für MyParent1 gibt es 630 MyChild Aufzeichnungen.

Ich habe eine Detailview für eine Klasse namens MyUI.

Der Benutzer wählt ein Element in einer Dropdown-im MyUI Detailview, und mein Code hat eine weiteren Drop-down mit MyChild Objekten zu füllen.

Der Benutzer wählt in der ersten Dropdown-MyParent1.

ich eine Immobilie in MyUI erstellt die Sammlung von MyChild Objekten für den ausgewählten Wert in dem ersten Dropdown-Menü zurückzukehren.

Hier ist der Code für die Eigenschaft:

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

Ich war die DisplayedValues Eigenschaft als NonPersistent, weil es nur für die Benutzeroberfläche des Details benötigt wird. Ich glaube nicht, dass es persistierenden wird die Schaffung der Sammlung zum ersten Mal beschleunigen, und nachdem er das Drop-down zu füllen verwendet wird, ich brauche es nicht, so will ich nicht Zeit damit verbringen, sie zu speichern.

Das Problem ist, dass es 45 Sekunden dauert theParentValue = this.DropDownOne zu nennen.

Specs:

  • Vista Business
  • 8 GB RAM
  • 2,33 GHz E6550 Prozessor
  • SQL Server Express 2005

Das ist zu lang für die Nutzer für eine von vielen Drop-downs in der Detailview warten.

habe ich die Zeit, um das Geschäftsmodell zu entwerfen, weil ich zwei Fragen:

  1. Wie kann ich die zugehörigen Werte laden schneller zu machen?

  2. Gibt es eine andere (einfach) Weg, um die Drop-downs und Detailview zu programmieren, die viel schneller läuft?

Ja, man kann sagen, dass 630 zu viele Elemente in einem Dropdown-Menü angezeigt werden, aber dieser Code ist so lange dauert vermute ich, dass die Geschwindigkeit an die 49.000 und nicht auf die 630. 100 Elemente in dem Dropdown proportional -down würde für meine App nicht allzu viele.

Ich brauche eine ganz wenige diesen Drop-downs in meiner app, so dass es nicht angemessen ist, um den Benutzer zu zwingen, kompliziertere Filterkriterien für jeden einzugeben. Der Benutzer muss einen Wert auswählen und die damit verbundenen Werte sehen.

Ich würde verstehen, wenn eine große Anzahl von Datensätzen war langsam, zu finden, aber ein paar hundert sollte nicht so lange dauern, zu finden.

War es hilfreich?

Lösung

Zum einen haben Sie Recht, skeptisch zu sein, dass dieser Vorgang so lange dauern sollte, XPO auf Leseoperationen hinzufügen sollte nur zwischen 30-70% Overhead, und auf dieser winzigen Menge an Daten, sollten wir milli-Sekunden nicht Sekunden reden <. / p>

Einige allgemeinen perf Tipps sind in den DevExpress Foren und drehen sich um Objekt-Caching, faul vs tief Lasten etc, aber ich denke, in Ihrem Fall ist das Problem etwas anderes, leider seine sehr schwer zu zweiter Vermutung, was los von Ihrem Frage, nur zu sagen, seine höchst unwahrscheinlich, ein Problem zu sein mit XPO viel wahrscheinlicher, etwas anderes zu sein, ich geneigt wäre, bei der Sitzung Schöpfung zu betrachten und SQL-Verbindungscode (dieser auch Ihr Objekt-Cache erstellt) (die IDataStore Sachen) , Anschlüsse sind oft langsam, wenn Hosts können nicht nicht sauber aufgelöst werden, und wenn Sie nicht bündeln / Wiederverwenden von Verbindungen dieses Problem noch verschärft werden kann.

Andere Tipps

Ich bin mir nicht sicher, warum Sie es so, wie Sie sind tun würde. Wenn Sie einen Verein wie diese erstellt haben:

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

dann, wenn Sie ein Drop-Down-auffüllen mögen (wie eine lookupEdit Kontrolle)

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

Sie müssen Kinder A ist nicht geladen werden, XPO sie geladen wird, wie sie benötigt werden, und es gibt keine Session-Management für diese notwendig überhaupt.

Danke für die Antwort. Ich habe eine separate Lösung und war in der Lage eine gute Leistung zu erhalten, wie Sie vorschlagen.

My SQL-Verbindung ist OK und arbeitet mit anderen Funktionen in der App.

Da ich XAF bin mit und nicht extra / Lust etwas zu tun, nicht meine Sitzungen verwaltet von XAF?

Die Sitzung verwende ich aus der Detailview lesen.

Ich bin mir nicht sicher über Ihren Fall, möchte nur mit XAF einige meiner Erfahrungen teilen.

Das erste Mal, wenn Sie auf einer Drop-Down-Taste (Lookup-Liste) Kontrolle (in einer Detailansicht), wird es zwei Anfragen an die Datenbank geschickt, um die Liste zu füllen. In meinen Tests wird manchmal gesamte Objekt in der Quellauflistung geladen, nicht nur Identifikation und Name Eigenschaften, wie wir abhängig gedacht auf Objekte, die Sie für Listen leichtere verwenden möchten. Sie können auch auf Server-Modus der Liste drehen dann nur 128 Objekte jedes Mal geladen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top