2008-09-15 7 views
3

多数のレコードを持つ関連付けプロパティにアクセスする速度に問題があります。DevExpress eXpressApp Framework(XAF)とeXpress Persistent Objects(XPO):関連付けの読み込み時間を短縮するにはどうすればよいですか?

親クラスがMyParentのXAFアプリがあります。

MyParentには230件のレコードがあります。

MyParentには、MyChildという子クラスがあります。

MyChildに49,000レコードあります。

私は標準的な方法でMyParentMyChildの間で定義された関連性があります。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"); } 
} 

MyParent1と呼ばれる特定のMyParentレコードがあります。

MyParent1には、630 MyChildのレコードがあります。

MyUIというクラスのDetailViewがあります。

MyUI DetailViewの1つのドロップダウンでアイテムを選択し、別のドロップダウンリストに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 
    } 

それが唯一のDetailVIewのUIのために必要とされているので、私はNonPersistentとしてDisplayedValuesプロパティをマーク。私はそれを持続させることが初めてのコレクションの作成をスピードアップし、ドロップダウンを埋めるために使用された後、私はそれを必要としないので、私はそれを格納する時間を費やしたくないと思います。

問題は、theParentValue = this.DropDownOneに電話するのに45秒かかります。

仕様:

  • Vista BusinessのRAM
  • 2の
  • 8ギガバイト33 GHzのE6550プロセッサ
  • SQL Server Expressは、2005

これは、ユーザーがDetailViewの多くのドロップダウンの1を待つためには長すぎます。

私は2つの質問があるので、私はビジネスケースをスケッチするために時間がかかった:

  1. にはどうすれば関連する値が速く読み込むことができますか?

  2. ドロップダウンをプログラムする別の(簡単な)方法と、より速く実行するDetailViewがありますか?

はい、あなたは630がドロップダウンに表示する、あまりにも多くの項目ですが、このコードはそう長く取っている私は速度が630〜100 49,000ないに比例していると思われると言うことができますがドロップダウンの項目は私のアプリにとってあまりにも多くないでしょう。

私のアプリではこれらのドロップダウンがかなり必要なので、それぞれにもっと複雑なフィルタリング基準を入力させるのは適切ではありません。ユーザーは1つの値を選択し、関連する値を参照する必要があります。

大量のレコードを見つけるのが遅いのは分かりますが、数百を見つけるのはそれほど長くはありません。

答えて

2

第1に、この操作にかかる時間がかかると懐疑的に思うのは当然です。読み取り操作でのXPOのオーバーヘッドは30〜70%に過ぎず、この小さなデータ量では秒単位ではなくミリ秒です。

いくつかの一般的なperfヒントはDevExpressフォーラムで利用でき、オブジェクトキャッシュ、怠け者と深い負荷などを中心に扱っていますが、私はあなたのケースでは問題が残念だと思っています。あなたの質問は、他の何かになる可能性が非常に高いXPOの問題である可能性は非常に低いですが、セッション作成(これもオブジェクトキャッシュを作成)とSQL接続コード(IDataStoreのもの)、ホストがきれいに解決できない場合は接続が遅くなり、接続をプーリング/再使用しない場合、この問題が悪化する可能性があります。

0

お返事ありがとうございます。あなたが提案するように、私は別のソリューションを作り、良いパフォーマンスを得ることができました。

私のSQL接続は問題なく、アプリケーション内の他の機能と連携します。

私はXAFを使用していて、余分な/何もしないと考えると、私のセッションはXAFによって管理されていませんか?

私が使用するセッションはDetailViewから読み込まれます。

1

あなたはあなたがそれをやっている理由が分かりません。あなたはこのような関連性作成した場合:あなたは(lookupEdit制御など)のドロップダウンを移入したいときに

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

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の子、XPO意志をロードする必要はありません必要に応じてロードしてください。セッション管理は必要ありません。

0

あなたのケースについてはわかりませんが、私の経験をXAFと共有したいだけです。

最初にドロップダウンリスト(詳細ビュー)をクリックすると、データベースに2つのクエリが送信され、リストに入力されます。私のテストでは、IDと名前のプロパティだけでなく、オブジェクト全体がソースコレクションに読み込まれることがあります。リストには軽いものを使用したい場合があります。リストのサーバーモードを有効にすると、毎回128のオブジェクトだけが読み込まれます。

関連する問題