2008-09-15 2 views
3

У меня возникла проблема со скоростью доступа к свойству ассоциации с большим количеством записей.DevExpress eXpressApp Framework (XAF) и стойкие объекты eXpress (XPO): как ускорить время загрузки ассоциаций?

У меня есть приложение XAF с родительским классом под названием MyParent.

Имеет 230 записей в MyParent.

MyParent имеет детский класс под названием MyChild.

Имеются 49 000 записей в MyChild.

У меня есть связь, образованную между MyParent и MyChild стандартным образом:

В MyChild:

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

И в MyParent:

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

Там в конкретных MyParent запись под названием MyParent1 ,

Для MyParent1 есть 630 MyChild записей.

У меня есть DetailView для класса под названием MyUI.

Пользователь выбирает элемент в одном раскрывающемся списке в подробном представлении MyUI, и мой код должен заполнить еще один раскрывающийся список объектами MyChild.

Пользователь выбирает MyParent1 в первом выпадающем списке.

Я создал объект в MyUI, чтобы вернуть коллекцию MyChild объектов для выбранного значения в первом выпадающем списке.

Вот код для свойства:

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

Я ознаменовал DisplayedValues собственности как NonPersistent, так как он необходим только для ПИ DetailView. Я не думаю, что его сохранение ускорит создание коллекции в первый раз, и после того, как она будет использоваться для заполнения раскрывающегося списка, мне это не нужно, поэтому я не хочу тратить время на ее хранение.

Проблема в том, что для вызова theParentValue = this.DropDownOne требуется 45 секунд.

Характеристики:

  • Vista Business
  • 8 Гб оперативной памяти
  • 2.33 ГГц E6550 процессор
  • SQL Server Express 2005

Это слишком долго для пользователей ждать один из многих раскрывающихся в DetailView.

Я взял время, чтобы набросать бизнес дело, потому что у меня есть два вопроса:

  1. Как я могу сделать соответствующие значения нагрузки быстрее?

  2. Есть ли другой (простой) способ программирования выпадающих списков и DetailView, которые работают намного быстрее?

Да, вы можете сказать, что 630 является слишком много элементов для отображения в раскрывающемся списке, но этот код занимает так много времени, я подозреваю, что скорость пропорциональна 49000, а не на 630. 100 элементов в раскрывающемся списке не будет слишком много для моего приложения.

Мне нужно довольно много этих выпадающих списков в моем приложении, поэтому не следует заставлять пользователя вводить более сложные критерии фильтрации для каждого из них. Пользователь должен выбрать одно значение и увидеть связанные значения.

Я бы понял, если поиск большого количества записей был медленным, но поиск нескольких сотен не должен длиться так долго.

ответ

2

Во-первых, вы правы, чтобы скептически относиться к тому, что эта операция должна длиться так долго, что операции XPO по чтению должны добавляться только от 30 до 70% накладных расходов, а на этом крошечном объеме данных мы должны говорить миллисекунды, а не секунды.

Некоторые общие главные советы доступны на форумах DevExpress, а также в центре вокруг кэширования объектов, ленивых и глубоких нагрузок и т. Д., Но я думаю, что в вашем случае проблема - это что-то другое, к сожалению, очень сложно догадаться, что происходит с ваш вопрос, только чтобы сказать, что его вряд ли будет проблемой с XPO, скорее всего, будет чем-то другим, я бы склонен смотреть на создание сеанса (это также создает кеш объекта) и код подключения SQL (материал IDataStore). Соединения часто бывают медленными, если хосты не могут быть решены чисто, и если вы не используете объединение/повторное использование соединений, эта проблема может быть обострена.

0

Спасибо за ответ. Я создал отдельное решение и смог получить хорошую производительность, как вы предлагаете.

Мое соединение SQL в порядке и работает с другими функциями приложения.

Учитывая, что я использую XAF и не делаю ничего лишнего/фантазии, не мои сеансы управляются XAF?

Сессия, которую я использую, считывается из DetailView.

1

Я не уверен, почему вы будете делать это так, как вы. Если вы создали ассоциацию, как это:

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

тогда, когда вы хотите, чтобы заполнить выпадающий список (как контроль lookupEdit)

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

Вам не нужно загружать детям, в XPO будет загружайте их по мере необходимости, и для этого не требуется никакого управления сеансом.

0

Я не уверен в вашем случае, просто хочу поделиться некоторыми своими впечатлениями с XAF.

В первый раз, когда вы нажимаете на раскрывающееся меню (в виде подробного представления), для заполнения списка будет отправлено два запроса, отправленных в базу данных. В моих тестах иногда весь объект загружается в исходную коллекцию, а не только свойства идентификатора и имени, как мы полагали, зависит от ваших объектов, которые вы, возможно, захотите использовать более легкие для списков. Вы также можете включить режим сервера в списке, тогда только 128 объектов загружаются каждый раз.

Смежные вопросы