DevExpress eXpressApp 프레임워크(XAF) 및 eXpress 영구 개체(XPO):연결 로딩 시간을 어떻게 단축하나요?

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

  •  09-06-2019
  •  | 
  •  

문제

레코드 수가 많은 연결 속성에 액세스하는 속도에 문제가 있습니다.

다음과 같은 상위 클래스가 있는 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 DetailView와 내 코드는 또 다른 드롭다운을 채워야 합니다. 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의 UI에만 필요하기 때문입니다.지속한다고 해서 처음 컬렉션 생성 속도가 빨라질 것이라고는 생각하지 않으며, 드롭다운을 채우는 데 사용한 후에는 필요하지 않으므로 저장하는 데 시간을 낭비하고 싶지 않습니다.

문제는 통화하는데 45초가 걸린다는 것 theParentValue = this.DropDownOne.

명세서:

  • 비스타 비즈니스
  • 8GB RAM
  • 2.33GHz E6550 프로세서
  • SQL 서버 익스프레스 2005

사용자가 DetailView의 많은 드롭다운 중 하나를 기다리기에는 이 시간이 너무 깁니다.

나는 두 가지 질문이 있기 때문에 비즈니스 사례를 간략하게 설명하는 시간을 가졌습니다.

  1. 관련 값을 더 빠르게 로드하려면 어떻게 해야 합니까?

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

예, 630은 드롭다운에 표시하기에는 항목이 너무 많다고 말할 수 있지만 이 코드는 너무 오래 걸립니다. 속도가 630이 아니라 49,000에 비례하는 것 같습니다.드롭다운에 있는 100개 항목은 내 앱에 너무 많지 않습니다.

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

많은 수의 레코드를 찾는 것이 느리다면 이해할 수 있지만, 수백 개의 레코드를 찾는 데 그렇게 오랜 시간이 걸리지는 않습니다.

도움이 되었습니까?

해결책

첫째, 이 작업이 이렇게 오래 걸릴 것이라는 회의적인 생각이 맞습니다. 읽기 작업의 XPO는 30~70%의 오버헤드만 추가해야 하며, 이 작은 양의 데이터에 대해 몇 초가 아닌 밀리초를 이야기해야 합니다.

몇 가지 일반적인 성능 팁은 DevExpress 포럼에서 확인할 수 있으며 개체 캐싱, 게으른 로드와 깊은 로드 등을 중심으로 하지만 귀하의 경우 문제는 다른 것인 것 같습니다. 불행히도 귀하의 질문에서 무슨 일이 일어나고 있는지 추측하기가 매우 어렵습니다. 즉, XPO에서 문제가 될 가능성은 거의 없으며 다른 문제일 가능성이 훨씬 높습니다. 세션 생성(객체 캐시도 생성됨)과 SQL 연결 코드(IDataStore 항목)를 살펴보고 싶습니다. 연결은 다음과 같습니다. 호스트를 깔끔하게 확인할 수 없고 연결을 풀링/재사용하지 않는 경우 속도가 느려지는 경우가 많으며 이 문제는 더욱 악화될 수 있습니다.

다른 팁

왜 당신이 지금의 방식으로 그렇게 하려는지 잘 모르겠습니다.다음과 같은 연결을 만든 경우:

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

A의 하위 항목을 로드할 필요가 없습니다. XPO는 필요할 때 이를 로드하며 이를 위해 세션 관리가 전혀 필요하지 않습니다.

답변 해주셔서 감사합니다.말씀하신대로 별도의 솔루션을 만들었고 좋은 성능을 얻을 수 있었습니다.

내 SQL 연결은 정상이며 앱의 다른 기능과 작동합니다.

내가 XAF를 사용하고 있고 추가 작업이나 멋진 작업을 수행하지 않는 경우 내 세션이 XAF에서 관리되지 않습니까?

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

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

자세히 보기에서 드롭다운(조회 목록) 컨트롤을 처음 클릭하면 목록을 채우기 위해 두 개의 쿼리가 데이터베이스로 전송됩니다.내 테스트에서는 ID 및 이름 속성뿐만 아니라 전체 개체가 소스 컬렉션에 로드되는 경우도 있습니다. 개체에 따라 다르므로 목록에 더 가벼운 개체를 사용하는 것이 좋습니다.목록의 서버 모드를 켜면 매번 128개의 개체만 로드됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top