5

私はかなり深いオブジェクトグラフ(5〜6ノード)を持っており、その一部をトラバースすると、NHProfは「SelectN + 1」の問題があると言っています(私はそうしています)。

私が知っている2つの解決策は

  1. 熱心な負荷の子供
  2. オブジェクトグラフを分解します(そして熱心な負荷)

私はこれらのどちらも本当にやりたくありません(ただし、グラフが成長することを予測しているので、後でグラフを分解する可能性があります)

今のところ....

NHibernate(FluentNHibernateを使用)に、子にアクセスしようとするたびに、子を反復処理するときにselect-n + 1-ingを実行するのではなく、すべてを一度にロードするように指示することはできますか?

また、「無制限の結果セット」を取得しています。これはおそらく同じ問題です(または、可能であれば上記の解決策で解決されます)。

各子コレクション(グラフ全体)には約20のメンバーしかありませんが、20 ^ 5は多いので、ルートを取得するときにすべてを熱心にロードしたくはありません。その近くに行きます。

編集:後付け....子をレンダリングしたいときにページングを導入したい場合はどうなりますか?ここでオブジェクトグラフを壊す必要がありますか、それともこれらすべての問題を解決するために使用できるいくつかのこっそりがありますか?

4

2 に答える 2

10

このシナリオを処理するために特定の nhibernate クエリを作成するのではなく、ドメイン モデルを使用するアプローチを追求したいと思われます。これを踏まえて、コレクションに適用できる batch-size 属性を確認することをお勧めします。Fluent NHibernate fluent インターフェイスはまだこの属性をサポートしていませんが、回避策として次を使用できます。

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")

正確なシナリオに関する一般的な情報が不足しているため、バッチサイズが理想的なソリューションであるかどうかはわかりませんが、試してみることをお勧めします. まだ読んでいない場合は、以下を読むことをお勧めします。

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate のパフォーマンスに関するドキュメントでは、バッチサイズがどのように機能するかについて説明しています。

編集: ドメイン モデルからページングする方法を知りません。ページングが必要なシナリオでは、NH クエリを作成することをお勧めします。

于 2009-02-24T11:40:16.393 に答える
0

編集:後付け....子をレンダリングしたいときにページングを導入したい場合はどうなりますか?ここでオブジェクトグラフを壊す必要がありますか、それともこれらすべての問題を解決するために使用できる卑劣なものはありますか?

さて、あなたが子供たちだけをロードするなら、あなたはそれらをページングすることができます:)。しかし、LoadParent AND PageChildrenのようなものが必要な場合は、それができないと思います。

于 2009-02-28T08:08:42.890 に答える