0

在很少重新启动的 Windows 服务中创建 NHibernate.ISession 实现的一个实例是否有害?我对 ISession 不是很了解,但据我了解,ISession 实现的一个实例包含对事务的引用,这些事务可以在我提交更改后立即处理掉

using (ITransaction trans = MyISession.BeginTransaction())
{
 ...
trans.Commit();
}

当我在线查看代码示例时,使用 autofac 的实现 ISession 几乎总是设置为 InstancePerLifetimeScope()。这实际上意味着实例一旦脱离创建它的上下文(例如 HTTP 请求)就会被释放。

有人可以告诉我将 nhibernate 注册为 autofac 中的单个实例以用于长时间运行的 Windows 进程的危害(如果有的话)吗?

builder.Register(c => new MyIsessionFactory.OpenSession()).As<ISession>().SingleInstance();
4

1 回答 1

3

会话跟踪它已加载甚至引用的所有实体和集合。

在应用程序的整个生命周期中保持会话打开会导致:

  • 极高的内存使用率
  • 极慢的操作(扫描加载的实体列表,这是由许多操作自动完成的,当太多时需要很长时间)
  • 无法从错误中恢复,因为会话状态在出现错误时会损坏
于 2013-06-06T23:48:08.650 回答