19

流暢なNHibernateを使用して、オブジェクトの大規模なコレクションをテーブルに挿入しようとしています。foreachループでコレクションから各エンティティを渡して、保存または更新を呼び出します。バッチサイズをコレクションのサイズに設定していましたが、Ayendeのブログで大きな値に設定することはお勧めできないと読んだので、250に制限しましたが、NHProfでコレクションを表示すると、バッチ化された挿入呼び出しのセットではなく、挿入ステートメントのストリーム(コレクションは約20000アイテム)を参照してください。

これは非常に非効率的であり、本質的に非常に基本的なクエリに期待するよりもはるかに長い時間がかかります-25列に値を挿入します(はい、これは改善できる1つの場所ですが、これはレガシーデータベースです私は今のところ立ち往生しています)SQL Server2008データベースに-だから私はそれを間違っているとしか思えません。

NHibernateを使用してエンティティの大規模なコレクションを挿入するための推奨される方法はありますか?Save over SaveOrUpdateを使用することで効率が向上しますか?

addメソッドのコード-SetBatchSize呼び出しは、バッチが250に制限されるか、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();
    }
}

少し漠然とした質問をお詫びします。私は物事に間違った方法でアプローチしているような気がします。どんなポインタでも大歓迎です!

4

1 に答える 1

6

一括挿入には StatelessSession を使用する必要があります。

(関連: NHibernate のステートレス セッションの挿入が遅い)

于 2012-07-05T17:15:47.780 に答える