NHibernate 会话的生命周期应该是多长?

2024-02-05

我是 NHibernate 的新手,在过早关闭会话时遇到了一些问题。我通过重用会话而不是为每个事务打开一个会话来暂时解决了这个问题。然而,我的印象是,每次需要时打开会话是会话生命周期管理的推荐方法。不?

所以;处理会话的推荐方法是什么?他们的一生应该是怎样的?一次交易?一个单例会话可以处理所有事情?或者是什么?

Edit:

请注意,我的应用程序架构是一个与服务器端服务通信的桌面应用程序,这是使用 NHibernate + Fluent 进行所有数据库处理的内容。 (如果这有什么区别的话......)


您需要一个会话管理策略,使您的应用程序能够有效运行并利用 NHibernate 为您提供的功能 - 最显着的是缓存和延迟加载。

创建会话是一个成本低廉的过程,并且需要很少的前期 RAM 或 CPU,因此您不必担心保存或重复使用会话(事实上,重复使用它们可能会导致一些令人讨厌的和不可预见的副作用)。会话工厂是昂贵的东西,应该在应用程序启动时构建一次且仅一次。

经验法则是:会话生存期需要足够长,以便在会话结束后不会有持久对象在范围内徘徊。

会话结束后,从该会话获得的对象的所有更改跟踪都会停止,因此除非您故意将该对象重新附加到新会话,否则这些更改不会保存。因此,只要您从中获取的对象存在,会话就应该存在。在 Web 应用程序中,这通常意味着每个请求都有一个会话;在 WinForms 中,每个表单都有一个会话。

在你的情况下,使用服务(我假设它正在运行as一个 Windows 服务)执行 NHibernate 工作,您可能希望考虑为来自消费桌面应用程序的每个新请求创建一个会话,并在该请求得到服务后将其释放。不确切地知道您的服务如何运行以及桌面应用程序使用什么机制与之通信(远程处理?WCF?普通的旧式 SOAP?)我真的无法更具体。

(这个一般规则有一些例外 - 假设您有一组持久对象,它们代表其他代码将引用但不会更改的共享资源,您可以在应用程序启动时预先加载这些对象,然后让它们断开连接在。)

如果您发现在这种策略下性能缓慢,可能是因为您与数据库的对话过多并且您的对象图很复杂;看着二级缓存 https://www.hibernate.org/hib_docs/nhibernate/html/caches.html在这种情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 会话的生命周期应该是多长? 的相关文章

随机推荐

  • 为什么.NET SmtpClient发送的邮件缺少Message-Id?

    这是我在 App Config 中的 SMTP 设置
  • ']' 标记之前的预期表达式?

    我有以下行发送参数args and length到一个名为largest printf Largest is d n largest args length 当我尝试运行此程序时 出现以下错误 error expected expressi
  • PHP 将 psd 转换为 jpg,选择图像图层

    我希望能够选择将 PSD 图像中的哪些图层合并到最终的 JPG 输出图像中 我可以将图像中的所有图层合并为 im new Imagick test psd im gt flattenImages im gt setImageFormat j
  • fgets() 返回 NULL 是否符合短缓冲区要求?

    在单元测试中 函数包含fgets 当缓冲区大小时遇到 意外结果n lt 2 显然这样的缓冲区大小是愚蠢的 但测试正在探索极端情况 简化代码 include
  • 如何测试iOS应用是否支持IPv6? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有 2015 年和 2014 年构建的应用程序 如何测试它们的 IPv6 性能 如果我的应用程序不支持 IPv6 我该怎么办 我的应用程序
  • Vitest错误“TypeError:无法读取未定义的属性(读取'resolve')”(router.resolve)

    我有一个非常基本的测试 但是当我尝试安装组件时它会抛出以下错误const wrapper mount HomeHeader 我已经粘贴了我的 vite 配置 测试 组件和包 这个错误发生时没有更新我的 vite 配置 但我继续更新了配置te
  • 为什么以 null 作为回调的 array_map() 创建一个“数组的数组”?

    今天我了解到一个特殊案例array map 在 PHP 中 文档中作为旁注提到了这一点 示例 4 创建数组的数组 上面的例子将输出 Array 0 gt Array 0 gt 1 1 gt one 2 gt
  • 如何在 Libgdx 中支持 OpenGL ES GL10、GL11 和 GL20?

    我正在编写一个使用 GL10 的 3d 游戏 但我希望该应用程序支持 GL11 或 GL20 如果可用 支持这三者的最佳设计是什么 或者这是一个愚蠢的差事 我应该只专注于支持一个版本 我当前的想法是将 render 函数拆分为 render
  • 故事板和笔尖兼容吗?

    我可以在我的所有应用程序中使用故事板 然后将其推送到一个笔尖 还是不可能同时使用这两个笔尖 故事板和 nib 可以在一个应用程序中一起使用 但如果您的部署目标低于 iOS 5 那么它将无法工作 故事板仅适用于 iOS 5 x 当然 您需要自
  • 启动另一个 Windows 应用商店应用程序

    当用户单击我的应用程序中的按钮时 是否可以启动不同的 Windows 应用商店应用程序 是的 您可以从您的应用程序启动其他 Windows 应用商店应用程序 例如 Bing 地图 地图应用程序支持协议激活 这意味着您可以使用特殊的 url
  • Apple 多个推送通知在通知托盘中不可见

    我基本上想在同一个应用程序中在 iOS 的通知托盘中显示多个推送通知 如果我的数据已打开 同时通过 APNS 触发推送通知 则此方案有效 但仅收到最新的数据 以防我离线并在一段时间后回来 此功能已得到 APNS 文档的确认 然而 这在 Wh
  • Laravel 如何使用另一台服务器作为文件存储

    我正在使用 Laravel 7 6 我在每台服务器中有两个 Laravel 项目 服务器是普通服务器 既不是 AWS 也不是 Digital Ocean 只是专用服务器 项目 1 位于服务器 1 中 项目 2 位于服务器 2 中 我的问题是
  • Servicereferences.clientconfig 更改值 silverlight

    我有一个 servicereference clientconfig 现在 我的安装团队正在为我的 silverlight 应用程序创建安装 这是一个问题 因为在 servicereference clientconfig 中有一组 Web
  • c# - 关闭浏览对话框导致表单关闭

    我有一个通过以下方式显示的表格 ShowDialog 表格没有CancelButton指定的 当我打开一个BrowseDialog从窗体中 然后关闭BrowseDialog 表格也被关闭 我怎样才能防止这种情况发生 单击 浏览 按钮时 br
  • 将 DTO 映射到域对象的最佳实践?

    我看到很多与映射相关的问题DTOs https en wikipedia org wiki Data transfer object到域对象 但我觉得他们没有回答我的问题 我以前使用过很多方法并有自己的意见 但我正在寻找更具体的方法 情况
  • PHP GET 请求,发送标头

    我需要执行获取请求并随之发送标头 我可以用什么来做到这一点 我需要设置的主要标头是浏览器标头 是否有捷径可寻 如果您使用 cURL 则可以使用curl setopt handle CURLOPT USERAGENT browser desc
  • Spring - 多种配置和@CompontentScan顺序

    我有多个Spring Configuration定义 bean 的类 我运行应用程序的主类有 SpringBootApplication scanBasePackageClasses BasePackage class 我的问题是 扫描这些
  • 什么是匹配不带子域的有效域名的正则表达式?

    我需要验证域名 谷歌网站 stackoverflow com 因此 一个最原始形式的域名 甚至不是像 www 这样的子域名 字符应该只是a z A Z 0 9 and period and dash 域名部分不应以破折号 开头或结尾 例如
  • 删除掩模图像中不需要的部分

    我使用 U2NET 成功计算了图像的掩模 如下所示 然而 正如我们所看到的 面具是not内部完全白色 并且在掩模外部 即左侧部分 也可以观察到一些不需要的伪影 我正在尝试使用膨胀和腐蚀操作来解决上述两个问题 但我认为这是错误的方法 因为它不
  • NHibernate 会话的生命周期应该是多长?

    我是 NHibernate 的新手 在过早关闭会话时遇到了一些问题 我通过重用会话而不是为每个事务打开一个会话来暂时解决了这个问题 然而 我的印象是 每次需要时打开会话是会话生命周期管理的推荐方法 不 所以 处理会话的推荐方法是什么 他们的