DevExpress eXpressApp フレームワーク (XAF) および eXpress Persistent Objects (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.33 GHz E6550 プロセッサー
- SQL Server Express 2005
これは、ユーザーが DetailView の多数のドロップダウンの 1 つを待つには長すぎます。
2 つの質問があるため、時間をかけてビジネス ケースを概略的に説明しました。
関連する値をより速く読み込むにはどうすればよいですか?
はるかに高速に実行される、ドロップダウンと DetailView をプログラムする別の (簡単な) 方法はありますか?
確かに、630 はドロップダウンに表示するには項目が多すぎるとも言えますが、このコードは非常に時間がかかるので、速度は 630 ではなく 49,000 に比例しているのではないかと疑っています。ドロップダウンの項目が 100 個であっても、私のアプリには多すぎません。
私のアプリにはこれらのドロップダウンがかなりの数必要なので、ユーザーにそれぞれのドロップダウンごとに複雑なフィルタリング条件の入力を強制するのは適切ではありません。ユーザーは値を 1 つ選択し、関連する値を確認する必要があります。
多数のレコードの検索に時間がかかるのは理解できますが、数百件のレコードの検索にはそれほど時間はかかりません。
解決
まず、この操作にこれほど時間がかかるのではないかという疑問は当然です。読み取り操作の 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 に関する私の経験をいくつか共有したいと思います。
初めてドロップダウン (ルックアップ リスト) コントロール (詳細ビューで) をクリックすると、リストにデータを入力するために 2 つのクエリがデータベースに送信されます。私のテストでは、ID プロパティと Name プロパティだけではなく、オブジェクト全体がソース コレクションに読み込まれることがあります。そのため、オブジェクトによっては、リストに軽いものを使用した方がよい場合があります。リストのサーバー モードをオンにすると、毎回 128 個のオブジェクトだけがロードされます。