在长时间运行中管理NHibernate会话

时间:2010-01-05 11:51:44

标签: .net nhibernate

我在Windows服务类型的应用程序中有一个场景,我需要加载 高达数千个实体,然后执行一些业务逻辑 保存他们。关于会话管理,这种下降 在每次通话的常规会话之外,经常讨论。 基本上,在我的情况下,我当然不希望一个会话(x) 千个实体。最明显的问题是 内存使用情况。

在这种情况下,协调工作的类(加载实体 然后将它们发送到特定的类进行处理)需要 能够对会话进行细粒度的控制。我是 考虑为每个实体销毁和创建新会话 需要处理。或者,也许有类似的东西 调用session.Clear()每次擦除一切?另一个 我需要的是能够销毁和重新创建一个会话 异常发生。每个实体代表所有的交易 该实体的业务逻辑需要成功或失败。如果失败了, 我需要回滚,销毁会话,然后创建一个新会话 转到下一个实体。

我甚至在考虑忽略整个知识库/ dao概念 并直接使用isession来保持简单。但是,使用我现有的daos会很棒。也许还有另一种方法,在我的协调类中,我可以定期清除或刷新会话以释放内存,并以某种方式将新会话放入dao中?

2 个答案:

答案 0 :(得分:1)

在ISession中拥有多个事务(一次一个)是很好的,因此如果必须回滚事务,则无需创建新会话。 ISession通常最好用于表示单个工作单元,但我认为这是一个特例。

您是否测量过内存使用情况?如果对象图完全加载了一组业务对象,那么ISession跟踪成千上万个对象并不是那么不寻常。考虑为多个客户加载所有销售订单和相关数据。

NHibernate的最佳性能是在批量操作中使用IStatelessSession。根据{{​​3}},无状态会话对500,000个对象的操作减少了约50%的执行时间。这让我猜到,在你有大约100,000个物体之前你不应该进行优化。

我认为任何一种解决方案 - 单个或多个ISession - 都可以正常工作,除非我遇到可衡量的性能问题,否则我不会尝试对其进行优化。

答案 1 :(得分:0)

每个实体一个ISession个实例适合此处的模型。会话是为一个工作单元而设计的,就每个实体而言,这就是你所拥有的 - 而不是像你说的那样“每次通话”。

如果发生异常,只需使用新的ISession实例再次为该实体启动该过程。

您应该能够使用我原本想到的现有代码。