DevExpress eXpressApp 프레임워크(XAF) 및 eXpress 영구 개체(XPO):연결 로딩 시간을 어떻게 단축하나요?
-
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의 많은 드롭다운 중 하나를 기다리기에는 이 시간이 너무 깁니다.
나는 두 가지 질문이 있기 때문에 비즈니스 사례를 간략하게 설명하는 시간을 가졌습니다.
관련 값을 더 빠르게 로드하려면 어떻게 해야 합니까?
훨씬 더 빠르게 실행되는 드롭다운 및 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개의 개체만 로드됩니다.