19

我正在尝试使用流利的 NHibernate 将大量对象集合插入到表中,使用调用来保存或更新在 foreach 循环中传递集合中的每个实体。我一直在将批量大小设置为集合的大小,但是我在 Ayende 的博客上读到不建议将其设置为较大的值,因此我将其上限设置为 250,但是当我在 NHProf 中查看集合时,我看到一个插入语句流(集合大约有 20000 个项目),而不是一组批量插入调用。

对于本质上非常基本的查询,这似乎非常低效并且花费的时间比我预期的要长得多 - 将一个值插入 25 列(是的,这是一个可以做得更好的地方,但它是一个遗留数据库我现在坚持)到一个 SQL Server 2008 数据库 - 所以我只能假设我做错了。

有没有推荐的方法来使用 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 回答