データベースから約 20000 レコードを具体化し、CSV として書き込む必要があります。残念ながら、NHibernate では、そのレコードの実体化は非常に遅くなります。Nhibernate Linq Provider によって生成された SQL を取得するオプションや、新しいオブジェクトを作成する代わりにストリームに行を書き込むカスタム マテリアライゼーション メカニズムを作成するオプションはありますか?
3 に答える
おそらく、LINQ の select 句を使用して、読み込まれたデータを何らかの DTO 型 (または匿名クラス) に直接射影する必要があります。これにより、NHibernate が状態を追跡するために通常行うすべてのことがバイパスされます。
まず、NHProf(http://www.hibernatingrhinos.com/products/NHProf)などのツールを使用して、NHibernateLinqプロバイダーによって生成されたSQLクエリを確認することを検討する必要があります。
NHibernateを使用しても、依存しているSQLDBを完全に抽象化することはできません。クエリに複数のテーブルまたはwhere条件が含まれる場合は、通常のSQLパフォーマンスの問題(つまり、インデックス、結合する列、サブクエリ)について考慮する必要があります。
20000レコードは私にはあまり思えないので、最初にその方向を見る必要があります。
実際にデータベースから読み取り、CSV に書き出すだけで、レコードを更新しない場合は、ステートレス セッションを使用して高速化できます。
このブログ投稿
http://ayende.com/blog/4137/nhibernate-perf-tricks
一括操作のパフォーマンスの高速化に関する情報があります。