使用NHibernate处理大量记录

时间:2011-04-16 20:26:08

标签: nhibernate

使用NHibernate加载集合和更新所有项目的最佳方法是什么。当前代码在其自己的事务中加载50个对象并处理每个对象(如果1失败,则其他事件都可以)。

NH Profiler说每个会话有太多的SQL查询。

毕竟,您如何看待这段代码?

using (var session = sessionFactory.OpenSession())
        {
            var myCollection =
                (from obj in session.Query<MyObject>()
                 select obj).Take(50);

            foreach (var item in myCollection)
            {
                using (var tx = session.BeginTransaction())
                {
                    try
                    {
                        //  Do some stuff...
                        session.Update(item);
                        tx.Commit();
                    }
                    catch (Exception)
                    {
                        tx.Rollback();
                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:5)

来自NHibernate: Streaming large result sets

  

NHibernate旨在用于   OLTP系统就是这样,它通常是   用于我们想要加载的情况   相对少量的数据来自   数据库,使用它并保存它   背部。对于报告方案,那里   是更好的选择,通常(和   在你问之前,任何报告包   会做。适合工作的正确工具等。)

     

但有些情况你想要   在报告中使用NHibernate   尽管如此。也许是因为   报告要求不是   足以证明去单独辩护   工具,或者因为你想使用什么   你已经知道了。在这种情况下   你往往会遇到问题,   因为你违反了这些假设   在建造时制造的   NHibernate的。

using (IStatelessSession s = sessionFactory.OpenStatelessSession())
{
    var books = new ActionableList<Book>(book => Console.WriteLine(book.Name));
    s.CreateQuery("from Book")
        .List(books);

}
  

无国籍会议,不像   正常的NHibernate会话,没有   跟踪加载的对象,所以   这里的代码和数据读取器代码是   基本上是一样的。

基本上,使用无状态会话和批处理。另请阅读:NHibernate Perf Tricks

答案 1 :(得分:0)

你有多少查询?也许你遇到了select N+1问题,因为你在“do stuff”部分的每个对象上加入了懒惰的属性。尝试在第一个查询中加入加入它们的对象上所需的所有部分。