使用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)
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技巧
| 归档时间: |
|
| 查看次数: |
2286 次 |
| 最近记录: |