C# 如何在NHibernate中使用MySQL对多个请求执行多线程会话?

C# 如何在NHibernate中使用MySQL对多个请求执行多线程会话?,c#,mysql,nhibernate,ninject,ninject.web.mvc,C#,Mysql,Nhibernate,Ninject,Ninject.web.mvc,我已经在我的MVC应用程序中使用NInject MVC5实现了NHibernate。一切都很好,但我意识到,当我双击我的链接时,总是会出现错误: {“已经有一个与此连接关联的打开的DataReader,必须先关闭它。”} 或 {“会话已关闭!\r\n对象名称:“ISession.” 现在我知道这是因为我将我的IContentService接口绑定到ISession。我还知道ISession不是线程安全的,只能使用一次。所以我的问题是。。。那么,我应该如何创建一个可以跨多个线程在RequestSc

我已经在我的MVC应用程序中使用NInject MVC5实现了NHibernate。一切都很好,但我意识到,当我双击我的链接时,总是会出现错误: {“已经有一个与此连接关联的打开的DataReader,必须先关闭它。”}

{“会话已关闭!\r\n对象名称:“ISession.”

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

我的注射中有:

 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();
Bind().To().InRequestScope();
Bind()//我确定问题就在这里,但不确定。
托梅多德先生(
上下文=>
context.Kernel.Get().GetSession())
.wheninjectedto()
.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>(); }
        }
    }
公共接口IContentService
{
IQueryable问题{get;}
}
公共类内容服务:IContentService
{
私有只读会话_session;//我想问题可能也在这里。。。
公共内容服务(ISession session)
{
_会话=会话;
}
公众可回答的问题
{
获取{return}session.Query();}
}
}
更新


我读过如何使用ISessionFactory进行多线程处理,但我无法像绑定ISession那样绑定它。

结果表明,我正确地使用了每个请求的会话进行多线程处理。问题是NHibernate有一个主要问题,MySQL过早地关闭了会话。我感谢你的答复。这绝对是一个难以解释的问题

更新

在这里找到了答案:

在中您已经被告知NHibernate会话不是线程安全的(您承认在这里和过去也知道)。反复问同一个问题不会改变世界,因为“会话工厂是线程安全的,会话不是。”但问题不同于上一个问题,我问的是如何使多线程会话一致,只是这个链接如何相关?你认为问不同的问题会导致不同的结果吗?"". 只要接受它,做一杯好茶,你告诉我这是一个失败的事业。NHibernate不能同时做两个会话?这是重复的,不幸的是,这是我自己发现的。在日志中,我看到它正在创建多个会话。因此,我最终不得不缓存查询并创建一个临时队列。我只是很惊讶,我是唯一一个在MySQL和NHibernate上有这个问题的人。当然有可能出现bug-你使用的是最新版本的MySQL连接器吗?另一方面,如果似乎没有其他人有这个问题,这表明它确实可能是代码中某个地方的问题。我不完全明白“缓存查询和队列”等的意思,但在我看来,这是一个巨大的解决方案,你不应该真的需要做。你是对的。他们根本的问题仍然存在,我必须解决它:(感觉好像我什么都试过了,什么都没用。你知道我可以花钱帮我解决这个问题吗?