2008-09-15 5 views
3

많은 수의 레코드가있는 연관 속성에 액세스하는 속도에 문제가 있습니다.DevExpress eXpressApp Framework (XAF) 및 eXpress Persistent Objects (XPO) : 연결로드 시간을 어떻게 단축합니까?

부모 클래스가 MyParent 인 XAF 앱이 있습니다.

MyParent에는 230 개의 레코드가 있습니다.

MyParent에는 MyChild이라는 하위 클래스가 있습니다.

MyChild에는 49,000 개의 레코드가 있습니다.

MyChild에서 :

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

그리고 MyParent의 :

특정 MyParent 기록 MyParent1라고
[Association("MyChild-MyParent", typeof(MyChild))] 
public XPCollection<MyCHild> MyCHildren 
{ 
    get { return GetCollection<MyCHild>("MyCHildren"); } 
} 

이있어

나는 표준적인 방법으로 MyParentMyChild 사이에 정의 된 관계를 가지고 .

MyParent1의 경우 630 MyChild 개의 레코드가 있습니다.

MyUI 클래스에 대한 DetailView가 있습니다.

사용자가 MyUI DetailView에서 하나의 드롭 다운에서 항목을 선택하고 내 코드가 다른 드롭 다운을 MyChild 개체로 채워야합니다.

사용자는 첫 번째 드롭 다운에서 MyParent1을 선택합니다.

첫 번째 드롭 다운에서 선택한 값에 대해 MyChild 개체 컬렉션을 반환하려면 MyUI에 속성을 만들었습니다. 여기

은 속성에 대한 코드이다 : 그것은 단지 DetailVIew의 UI에 필요하기 때문에
[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 
    } 

내가 NonPersistent으로 DisplayedValues 특성을 표시했다. 나는 그것을 유지하는 것이 처음으로 컬렉션의 생성 속도를 높이고 드롭 다운을 채우기 위해 사용 된 후에는 필요하지 않기 때문에 저장하는 데 시간을 낭비하고 싶지는 않을 것이라고 생각합니다.

문제는 theParentValue = this.DropDownOne에 전화하는 데 45 초가 걸린다는 점입니다.

사양 :

  • 비스타 비즈니스 RAM
  • 2의
  • 8기가바이트33 GHz의 E6550 프로세서
  • SQL Server Express는 2005

이 사용자가 DetailView 많은 드롭 다운 중 하나 기다릴 너무 깁니다.

  1. 가 어떻게 관련 값이 빠르게로드 할 수 있습니다 : 나는 두 가지 질문을 가지고 있기 때문에

    나는 비즈니스 사례를 스케치하는 시간을했다?

  2. 드롭 다운과 더 빠르게 실행되는 DetailView를 프로그래밍하는 또 다른 (간단한) 방법이 있습니까?

예, 당신은 630 드롭 다운에 표시 할 너무 많은 항목이지만,이 코드는 오랫동안 나는 속도가 49,000에 비례한다는 생각이 아니라 630 100 그렇게하고 있음을 말할 수있다 드롭 다운의 항목이 내 앱에 너무 많지는 않습니다.

내 드롭 다운이 많이 필요하므로 사용자가 더 복잡한 필터링 기준을 입력하도록하는 것은 적절하지 않습니다. 사용자는 하나의 값을 선택하고 관련 값을 확인해야합니다.

많은 수의 레코드를 찾는 것이 느리다고 생각하지만 몇 백 개를 찾는 것은 그리 오래 걸리지 않아야합니다.

답변

2

처음에는이 작업이 오래 걸릴 것이라는 회의적 인 견해가 있습니다. 읽기 작업에서 XPO는 30-70 %의 오버 헤드 만 추가해야하며이 작은 양의 데이터에는 초 단위가 아닌 밀리 초가 있어야합니다.

몇 가지 일반적인 perf 팁은 DevExpress 포럼에서 사용할 수 있으며 객체 캐싱, 게으른 대 심부로드 등을 중심으로합니다.하지만 문제는 다른 것으로 생각합니다. 불행히도 두 번째 추측은 매우 어렵습니다. 당신의 질문은 XPO의 문제가 될 가능성이 매우 높습니다. 세션 작성 (이것도 객체 캐시를 생성합니다)과 SQL 연결 코드 (IDataStore 항목) 호스트가 깨끗하게 해결할 수없는 경우 연결 속도가 느리고 연결을 풀링/재사용하지 않으면이 문제가 악화 될 수 있습니다.

0

답변 해 주셔서 감사합니다. 나는 별도의 솔루션을 만들었고 좋은 성능을 얻을 수있었습니다.

SQL 연결이 정상이며 앱의 다른 기능과 호환됩니다.

XAF를 사용 중이며 추가/공상을하지 않으면 XAF에서 내 세션을 관리하지 않습니까?

내가 사용하는 세션은 DetailView에서 읽습니다.

1

나는 당신이 왜 그런 식으로 행동하는지 확신 할 수 없습니다. 이 같은 협회 만든 경우 : 다음의 (a lookupEdit 제어 등) 드롭 다운을 채울하고자 할 때

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

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

당신은 XPO 것, A의 아이를로드 할 필요는 없습니다 필요할 때로드하십시오. 세션 관리가 필요하지 않습니다.

0

귀하의 사례에 대해 확실하지 않지만 XAF에 대한 경험을 공유하고 싶습니다.

처음으로 드롭 다운 (조회 목록) 컨트롤을 클릭하면 (세부보기에서) 데이터베이스에 두 개의 쿼리가 전송되어 목록을 채 웁니다. 내 테스트에서 우리가 생각한 것처럼 ID와 Name 속성뿐만 아니라 전체 개체가 소스 컬렉션에로드되는 경우가 있습니다. 개체에 따라 다르므로 목록에 밝은 개체를 사용하려고 할 수 있습니다. 목록의 서버 모드를 켜면 매번 128 개의 개체 만로드됩니다.