【问题标题】:How to multi-thread a Session in NHibernate using MySQL for multiple requests?如何使用 MySQL 对 NHibernate 中的会话进行多线程处理以处理多个请求?
【发布时间】:2016-11-30 19:56:46
【问题描述】:

我已经在我的 MVC C# 应用程序中使用 NInject MVC5 实现了 NHibernate。一切正常,但我意识到当我双击我的链接时,我总是得到错误: {"已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它。"}

{"会话已关闭!\r\n对象名称:'ISession'。"}

现在我知道这是因为我将 IContentService 接口绑定到 ISession。我也知道 ISession 不是线程安全的,只能使用一次。所以我的问题是......那么我应该如何创建一个可以跨多个线程同时使用 InRequestScope 的会话。因为我知道用户会双击或者用户会同时点击一个链接,另一个用户正在点击同一个链接,而阻止多个用户的错误并不是很理想。

我的注射剂中有这个:

 Bind<IContentService>().To<ContentService>().InRequestScope();

            Bind<ISession>() //I'm sure the problem is right here, but not sure.
               .ToMethod(
                   context =>
                       context.Kernel.Get<IMasterSessionSource>().GetSession())
               .WhenInjectedInto<IContentService>()
               .InRequestScope();

我的内容服务

public interface IContentService
    {
        IQueryable<Question> Questions{ get; }
    }


 public class ContentService : IContentService
    {
        private readonly ISession _session; //I think the problem might be here too...

        public ContentService(ISession session)
        {
            _session = session;
        }

        public IQueryable<Question> Questions
        {
            get { return _session.Query<Question>(); }
        }
    }

更新

我阅读了我应该如何使用 ISessionFactory 进行多线程,但我无法像 ISession 那样绑定它。

【问题讨论】:

标签: c# mysql nhibernate ninject ninject.web.mvc


【解决方案1】:

事实证明,我对每个请求的会话进行了正确的多线程处理。问题是 NHibernate 的一个主要问题是 MySQL 过早关闭会话。我很欣赏你的回应。这绝对是一个难以解释的问题。

更新

在这里找到了答案: Session is closed Object name: 'ISession'. at NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() - How to stop the session from closing prematurely

【讨论】:

  • 不幸的是,这是我自己发现的。在日志中,我看到它正在创建多个会话。所以我最终不得不缓存查询并制作一个轮班队列。我只是很惊讶我是唯一一个遇到 MySQL 和 NHibernate 问题的人。
  • 当然有bug的可能——你用的是最新版的mysql连接器吗?另一方面,如果似乎没有其他人遇到问题,这表明它确实可能是您代码中的某个问题。我不明白你所说的“缓存查询和队列”等是什么意思,但对我来说这听起来像是一个巨大的解决方法,你不应该真的需要这样做。
  • 你是对的。他们的根本问题仍然存在,我必须解决它:(感觉就像我已经尝试了一切,但没有任何工作。你知道我可以支付帮助我解决这个问题的资源吗?
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 2019-03-14
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
相关资源
最近更新 更多