DevExpress eXpressApp Framework (XAF) y objetos persistentes eXpress (XPO):¿Cómo acelero el tiempo de carga de las asociaciones?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un problema con la velocidad de acceso a una propiedad de asociación con una gran cantidad de registros.

Tengo una aplicación XAF con una clase principal llamada MyParent.

Hay 230 registros en MyParent.

MyParent tiene una clase secundaria llamada MyChild.

Hay 49.000 registros en MyChild.

Tengo una asociación definida entre MyParent y MyChild de la forma estándar:

En MyChild:

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

Y en MyParent:

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

Hay un especifico MyParent registro llamado MyParent1.

Para MyParent1, hay 630 MyChild registros.

Tengo un DetailView para una clase llamada MyUI.

El usuario elige un elemento en un menú desplegable en el MyUI DetailView, y mi código tiene que llenar otro menú desplegable con MyChild objetos.

El usuario elige MyParent1 en el primer menú desplegable.

Creé una propiedad en MyUI devolver la colección de MyChild objetos para el valor seleccionado en el primer menú desplegable.

Aquí está el código de la propiedad:

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

marqué el DisplayedValues propiedad como NonPersistent porque solo es necesario para la interfaz de usuario de DetailVIew.No creo que persistir acelere la creación de la colección la primera vez, y después de usarla para llenar el menú desplegable, no la necesito, así que no quiero perder tiempo almacenándola.

El problema es que tarda 45 segundos en llamar. theParentValue = this.DropDownOne.

Especificaciones:

  • Vista de negocios
  • 8 GB de RAM
  • Procesador E6550 de 2,33 GHz
  • SQL Server expreso 2005

Esto es demasiado tiempo para que los usuarios esperen uno de los muchos menús desplegables en DetailView.

Me tomé el tiempo para esbozar el caso de negocio porque tengo dos preguntas:

  1. ¿Cómo puedo hacer que los valores asociados se carguen más rápido?

  2. ¿Existe otra forma (simple) de programar los menús desplegables y DetailView que se ejecute mucho más rápido?

Sí, puedes decir que 630 son demasiados elementos para mostrarlos en un menú desplegable, pero este código está tardando tanto que sospecho que la velocidad es proporcional a los 49.000 y no a los 630.100 elementos en el menú desplegable no serían demasiados para mi aplicación.

Necesito varios de estos menús desplegables en mi aplicación, por lo que no es apropiado obligar al usuario a ingresar criterios de filtrado más complicados para cada uno.El usuario debe elegir un valor y ver los valores relacionados.

Lo entendería si encontrar una gran cantidad de registros fuera lento, pero encontrar unos cientos no debería llevar tanto tiempo.

¿Fue útil?

Solución

En primer lugar, tiene razón al ser escéptico respecto de que esta operación deba tardar tanto, XPO en operaciones de lectura debería agregar solo entre un 30 y un 70 % de sobrecarga, y en esta pequeña cantidad de datos deberíamos estar hablando de milisegundos, no de segundos.

Algunos consejos generales de rendimiento están disponibles en los foros de DevExpress y se centran en el almacenamiento en caché de objetos, cargas diferidas versus cargas profundas, etc., pero creo que en su caso el problema es otra cosa; desafortunadamente, es muy difícil adivinar qué está pasando con su pregunta, solo es decir, es muy poco probable que sea un problema con XPO y mucho más probable que sea otra cosa, me inclinaría a mirar la creación de su sesión (esto también crea su caché de objetos) y el código de conexión SQL (las cosas de IDataStore), las conexiones son a menudo es lento si los hosts no se pueden resolver limpiamente y si no se agrupan/reutilizan conexiones, este problema puede exacerbarse.

Otros consejos

No estoy seguro de por qué lo harías como lo haces.Si ha creado una asociación 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; }
}

luego, cuando desee completar un menú desplegable (como un control de búsqueda y edición)

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

No es necesario cargar los elementos secundarios de A, XPO los cargará según sea necesario y no es necesaria ninguna gestión de sesión para ello.

Gracias por la respuesta.Creé una solución separada y pude obtener un buen rendimiento, como sugieres.

Mi conexión SQL está bien y funciona con otras funciones de la aplicación.

Dado que estoy usando XAF y no hago nada extra o sofisticado, ¿no son mis sesiones administradas por XAF?

La sesión que uso se lee desde DetailView.

No estoy seguro de tu caso, solo quiero compartir algunas de mis experiencias con XAF.

La primera vez que haga clic en un control desplegable (lista de búsqueda) (en una vista detallada), se enviarán dos consultas a la base de datos para completar la lista.En mis pruebas, a veces se carga el objeto completo en la colección de origen, no solo las propiedades de ID y Nombre, como pensábamos, depende de sus objetos, es posible que desee usar objetos más claros para las listas.También puede activar el Modo Servidor de la lista, de modo que solo se cargan 128 objetos cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top