使用NHibernate处理大量记录

myn*_*kow 4 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();
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

reb*_*ard 6

来自NHibernate:流式传输大型结果集:

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);

}
Run Code Online (Sandbox Code Playgroud)

与普通的NHibernate会话不同,无状态会话不跟踪加载的对象,因此这里的代码和数据读取器代码基本相同.

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