gpt4 book ai didi

.net - 在长时间运行的操作中管理 NHibernate session

转载 作者:行者123 更新时间:2023-12-04 00:25:50 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

你测量过内存使用情况吗?如果为一组业务对象完全加载了对象图,则 ISession 跟踪数以万计的对象并不少见。考虑加载多个客户的所有销售订单和相关数据。

NHibernate 的最佳性能是在批量操作中使用 IStatelessSession。根据 this article ,无状态 session 将 500,000 个对象的操作的执行时间减少了约 50%。这让我猜测你不应该优化,直到你有大约 100,000 个对象。

我认为任何一种解决方案——单个或多个 ISessions——都可以正常工作,除非我有可衡量的性能问题,否则我不会尝试优化它。

关于.net - 在长时间运行的操作中管理 NHibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com