gpt4 book ai didi

NHibernate session (和无状态 session )和长时间运行的应用程序

转载 作者:行者123 更新时间:2023-12-04 01:45:24 24 4
gpt4 key购买 nike

在旨在运行作业的 Windows Web 服务的上下文中,我们尝试重用我们为 Web 应用程序开发的 NHibernate DAL。

对于 session 管理,我们有两种选择,每种都有其优点和缺点:

有状态 session

  • 因为它会跟踪所有内容(L1/ session 缓存)
  • ,所以会增长很多
  • 需要小心关闭, session 处理似乎不足以清除 L1 缓存(我注意到使用内存分析器)

  • 无状态 session
  • 目前无法重用映射。所有用“lazy=true”声明的包最终都会出现以下异常(即使 session 尚未关闭):

  • Initializing [...] failed to lazily initialize a collection of role: [...], no session or session was closed



    显然,我们 不能使用lazy="false"更新映射(它们与网络应用程序共享),这将是性能的一个巨大缺点
  • 无法与 L2 缓存交互:部署共享 L2 缓存时,服务将无法使 L2 缓存数据无效,以便 Web 应用程序拥有最新数据

  • 到目前为止,NHibernate 已经被证明是好的,我们已经成功地在 web 上下文中使用了有状态 session 和 NHibernate LINQ,并带有用于依赖注入(inject)的结构图。

    我的问题是:
  • 在长时间运行的线程中使用 NHibernate 有什么好的解决方案吗?
  • 我更喜欢使用有状态 session ,但如何避免内存泄漏?
  • 最佳答案

    问题解决了!实际上有几个问题。

    第一个是关于实例的范围和多线程:

  • 为每个线程创建一个新 session 。
  • 线程完成其工作后,立即清理附加到该线程的所有实例。对于 StructureMap,在线程中使用 new HybridLifecycle().FindCache().DisposeAndClear(); .它将导致附加到线程的 session 关闭并释放。
  • 当生命周期是线程范围时,StructureMap 使用 ThreadStatic变量以保持对对象缓存的引用。所以诀窍是在线程中调用 StructureMap 的 ObjectFactory。最初,在我们的应用程序中,一个主线程负责创建新线程,并调用 ObjectFactory。这是我们犯的主要错误,一旦他们的工作完成,确实无法清理线程。

  • session 类型:
  • 无需使用 StateLessSession,只要实例化的 StateFul session 被仔细处理。在我们的例子中,StatelessSession 有太多的缺点(缓存管理是主要的)

  • 重要提示:注意只实例化 NHibernate NHibernate Session Factory 一次!

    当 NHibernate 实例被仔细管理时,没有内存泄漏。

    关于NHibernate session (和无状态 session )和长时间运行的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12817014/

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