gpt4 book ai didi

nhibernate - 如何在长期存在的 Windows 窗体应用程序中管理 NHibernate session ?

转载 作者:行者123 更新时间:2023-12-03 12:28:03 26 4
gpt4 key购买 nike

我们正在使用 NHibernate 来管理我们在复杂的模块化 Windows 窗体应用程序中的持久性 - 但一个想法一直困扰着我。我们目前在启动时打开一个 session 并通过该 session 打开所有对象。我担心所有加载的对象都被加载到 NHibernate session 缓存中,因此它们不能被垃圾收集,最终我们将整个数据库都放在内存中。

Web 应用程序永远不会发生这种情况,因为网页请求(甚至更好的 Ajax 请求)代表了完美的短暂事务,因此可以打开和关闭 session 来处理每个请求。

但是,如果我在表单应用程序中加载对象树,然后将其放入屏幕上的导航 Pane 中,它们可能会在应用程序的整个生命周期内保持不变 - 并且在任何时候用户都可以点击它们,导致我们的代码需要将对象关系导航到其他对象(仅在 NHibernate session 中有效)。

StackOverflow 读者如何在没有我描述的问题的情况下保持 NHibernate 的好处?

最佳答案

Ayende 和公司通常建议每次“对话”使用一个 session 。这通常会使 session 生命周期持续很短的操作,因此它的行为更像是一个 Web 应用程序。

对于您的树案例,您可以使用 Bruno 的解决方案 #2 就好了。对象可以被延迟映射。然后,每次您需要访问子集合时,您都会开始对话并通过 ISession.Lock 重新连接父集合。然后当数据绑定(bind)完成后,关闭该 session 。不需要太多维护开销,只需几行任何形式的代码即可进行对话;如果您觉得很时髦,您可以扩展 Form 和您使用的控件来自动执行此操作。

因此,棘手的部分是来自不同 session 的并发编辑。我们不要去那里!

关于nhibernate - 如何在长期存在的 Windows 窗体应用程序中管理 NHibernate session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/345160/

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