【问题标题】:NHibernate ISession usage and thread safetyNHibernate ISession 使用和线程安全
【发布时间】:2010-11-02 12:46:15
【问题描述】:

当我将 ISession 生命周期配置为“每个 HTTP 请求”(我正在使用的 Autofac 中的 InstancePerLifetimeScope)时,NHibernate 分析器告诉我我的 Session 正在跨线程使用,这很可能是一个错误。到底是怎么回事? 我习惯于认为我应该将工作单元范围限定为 http 请求,但似乎会话确实被跨线程使用。

本质上,这个“每个 HTTP 请求的 ISession”与 NHibernate 分析器警报冲突。 我哪里错了?

更新:我的 Web.config 中确实有一个 ContainerDisposalModule,因此处置工作正常

【问题讨论】:

  • 沉默的反对者请评论您的决定,谢谢!
  • +1 反对反对票。这是一个完全合理的问题。
  • 您的 IIS 版本的 Web.config 的正确部分中是否有 ContainerDisposalModule?另一个线程可能是终结器..

标签: nhibernate asp.net-mvc-2 autofac


【解决方案1】:

IIS(与大多数 Web 服务器一样)使用多个线程来处理请求,因此这可能不是您的应用程序中的错误,您可以放心地忽略这些警告。

另见this question

【讨论】:

  • 我知道 asp.net 在从线程池中取出的线程上执行每个请求。但是 AFAIK 它不应该在单个请求中使用多个线程。每个请求内部都是单线程的,不是吗?
  • @Valentin Vasiliev:如果它的异步,它可以跳线程 - 不要假设所有工作都在同一个线程上处理
  • "如果它是异步的" - 什么是异步?我没有使用异步控制器。我假设当控制器被实例化时,它的动作方法是在一个也是唯一的线程上调用的。所以问题仍然存在,NH prof 怎么可能检测到 one asp.net mvc 控制器实例中的线程使用情况?
  • IIS/ASP.NET 可以并且确实使用多个线程来处理单个请求。例如,它可能会在另一个线程上加载外部文件(.js 或图像)。您可以通过在 Session_EndRequest 中处理 ISession 来轻松证明这一点——这有时会导致“没有会话或会话已关闭”错误。
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多