2009-11-13 8 views
9

実際には、デフォルトのNHibernate(v2.0 & 2.1)FlushMode = Autoが非常に高価であることがわかりました。 NHibernateのソースを見てみると、何をフラッシュする必要があるのか​​を判断するためのアルゴリズムは、セッション中のすべてのエンティティをルーピングするというブルートフォースに依存していることがわかります。なぜNHibernate AutoFlushは非常に高価なチェックですか?

多くの項目の更新を含むいくつかの生産シナリオでは、複数のクエリを使用して、FlushMode = Autoと比較して、FlushMode = Commitと比較してプロセスが100倍長いことがわかりました。

FlushModeの使用のための任意の考え/アドバイス/ベスト・プラクティスは、複数の更新プログラムを含む「複雑な」セッション・ロジックを実行し、複数のクエリなど

任意のアイデアNHibernateはで自動フラッシュアルゴリズムを最適化しますか?

+0

関連する質問:http://stackoverflow.com/questions/1724307/nhibernate-poor-performance-on-auto-flush-events – zvolkov

+0

うん...実際には同じ問題:)知って喜ん – Pawel

答えて

6

この遅さは既知の問題であり、NHで3つのフラッシュモードがありますNH-1365

としてNHはJiraで追跡されています

  • FlushMode.Auto =フラッシュ(コミット上およびクエリの前に必要に応じて、必要に応じて)。これがデフォルトです。
  • FlushMode.Commit = NHトランザクションのみのコミット時にフラッシュする
  • FlushMode.Never =決してフラッシュしない(Flushが呼び出されるまで)。ネイティブ(アイデンティティ)PKジェネレータを使用するエンティティを挿入すると、still go to DBになります。
+0

おかげで、その既知の問題。それが1年以上にわたり知られている問題であることを知って悲しい!私は実行されたフラッシュの数を制限するコードを再配置する方法がたくさんあることを感謝します。それにもかかわらず、Nhibernateのフラッシング性能は、はるかに遅くなるようです。 – Pawel

関連する問題