2012-07-05 10 views
16

私は流暢なNHibernateを使ってテーブルに大量のオブジェクトのコレクションを挿入しようとしています。私はバッチサイズをコレクションのサイズに設定していましたが、大きな値に設定することは推奨されていないので、私は250でキャップしましたが、NHProfでコレクションを見ると、私はAyendeのブログを読みましたバッチインサート呼び出しのセットではなく、insertステートメントのストリーム(コレクションは約20000アイテム)を参照してください。Fluent NHibernateを使って一括してエンティティのコレクションを挿入する

これは非常に効率が悪く、本質的に非常に基本的なクエリに期待するよりもはるかに長い時間がかかります。25列に値を挿入することは可能です(これは1つの場所ですが、それは私が今のところ取り組まれているレガシーデータベースです)をSQL Server 2008データベースに入れてしまいました。

NHibernateを使って大量のエンティティを挿入する方法はありますか? SaveOrUpdate経由での保存を使用すると、効率が向上しますか?

addメソッドのコード - それは250未満かどうSetBatchSizeコールはバッチが250に蓋をし、またはコレクションのサイズに設定されている:私が得る少し漠然とした質問に対する

public void Add(IEnumerable<TEntity> entities) 
{ 
    var session = GetCurrentSession(); 
    using (var transaction = session.BeginTransaction()) 
    { 
     entities = entities.ToList(); 

     session.SetBatchSize(SetBatchSize(entities.Count())); 

     foreach (var entity in entities) 
      session.SaveOrUpdate(entity); 

     transaction.Commit(); 
    } 
} 

謝罪、私はちょうど間違った方法と任意のポインタに近づいている感じは大いに感謝される!

答えて

3

バルク挿入にはStatelessSessionを使用します。

(関連:Inserts of stateless session of NHibernate are slow

+1

おかげで、私はリンクを見ても、ステートレス・セッションを使用するように、インサートの上に変え、そしてそれは本当にすべての違いを作っていないました。問題の一部は、これはブラウンフィールドアプリであり、アイデンティティを生成するオプションはありません。 NHがレコードを挿入するときに範囲識別を要求せずに挿入を実行する方法はありますか? –

+1

免責事項:NHibernateに必要なものだけをさせる方法があります。しかし、この場合、モデルを変更することはできません。私はNHがこの場合には適切なツールではないと主張したい。 – hometoast

+1

ありがとう、それは私が来る結論のようなものです。私は別の質問でスコープのアイデンティティーについて具体的に質問しました。誰かがどんな形態の魔法を使うことができるかを知っている人のためです。 –

関連する問題