2012-07-05 51 views
16

我想要使用连贯的NHibernate将大量对象集合插入到表中,使用调用保存或更新从foreach循环中的集合中传递每个实体。我一直在设置批量大小的集合的大小,但我已阅读Ayende的博客,将其设置为较大的值不建议,所以我已经在250上限,但是当我在NHProf中查看集合时,我查看插入语句流(该集合约为20000项),而不是一组批量插入调用。使用流利的NHibernate批量插入实体集合

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

是否有推荐的方法来插入使用NHibernate的大型实体集合?通过使用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(); 
    } 
} 

道歉稍微模糊的问题,我得到感觉我只是接近错误的方式和任何指针将不胜感激!

回答

3

你会想要使用一个StatelessSession来批量插入。

(相关:Inserts of stateless session of NHibernate are slow

+1

谢谢,我已经看过了链接,也改变了插入使用无状态会话,并且它没有作出任何差别真的。部分问题在于这是一款棕色域名应用,我无法选择生成身份。有没有办法强制NH插入记录时执行插入而不请求范围标识? – 2012-07-06 10:50:14

+1

声明:有一种方法可以让NHibernate完成任何你想做的事情。但是 - 在这种情况下,你不能改变你的模型。我认为NH在这种情况下不是适当的工具。 – hometoast 2012-07-06 11:08:06

+1

谢谢,这就是我想要得出的结论。我在另一个问题中特别询问了范围标识,以防万一谁知道我可以使用任何形式的魔法。 – 2012-07-06 11:36:15