使用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();
}
}
}
}
答案 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”部分的每个对象上加入了懒惰的属性。尝试在第一个查询中加入加入它们的对象上所需的所有部分。