我在Windows服务类型的应用程序中有一个场景,我需要加载 高达数千个实体,然后执行一些业务逻辑 保存他们。关于会话管理,这种下降 在每次通话的常规会话之外,经常讨论。 基本上,在我的情况下,我当然不希望一个会话(x) 千个实体。最明显的问题是 内存使用情况。
在这种情况下,协调工作的类(加载实体 然后将它们发送到特定的类进行处理)需要 能够对会话进行细粒度的控制。我是 考虑为每个实体销毁和创建新会话 需要处理。或者,也许有类似的东西 调用session.Clear()每次擦除一切?另一个 我需要的是能够销毁和重新创建一个会话 异常发生。每个实体代表所有的交易 该实体的业务逻辑需要成功或失败。如果失败了, 我需要回滚,销毁会话,然后创建一个新会话 转到下一个实体。
我甚至在考虑忽略整个知识库/ dao概念 并直接使用isession来保持简单。但是,使用我现有的daos会很棒。也许还有另一种方法,在我的协调类中,我可以定期清除或刷新会话以释放内存,并以某种方式将新会话放入dao中?
答案 0 :(得分:1)
在ISession中拥有多个事务(一次一个)是很好的,因此如果必须回滚事务,则无需创建新会话。 ISession通常最好用于表示单个工作单元,但我认为这是一个特例。
您是否测量过内存使用情况?如果对象图完全加载了一组业务对象,那么ISession跟踪成千上万个对象并不是那么不寻常。考虑为多个客户加载所有销售订单和相关数据。
NHibernate的最佳性能是在批量操作中使用IStatelessSession。根据{{3}},无状态会话对500,000个对象的操作减少了约50%的执行时间。这让我猜到,在你有大约100,000个物体之前你不应该进行优化。
我认为任何一种解决方案 - 单个或多个ISession - 都可以正常工作,除非我遇到可衡量的性能问题,否则我不会尝试对其进行优化。
答案 1 :(得分:0)
每个实体一个ISession
个实例适合此处的模型。会话是为一个工作单元而设计的,就每个实体而言,这就是你所拥有的 - 而不是像你说的那样“每次通话”。
如果发生异常,只需使用新的ISession
实例再次为该实体启动该过程。
您应该能够使用我原本想到的现有代码。