2016-07-27 6 views
-3

내 MVC C# 응용 프로그램에서 NInject MVC5를 사용하여 NHibernate를 구현했습니다. 모든 것이 잘 작동하지만 링크를 두 번 클릭하면 항상 오류가 발생합니다. { "먼저이 연결과 연결된 열려있는 DataReader가 있으며 먼저 닫아야합니다."}여러 요청에 대해 MySQL을 사용하여 NHibernate에서 세션을 멀티 스레드하는 방법은 무엇입니까?

또는

은 { "세션이 닫혀 \ 연구 \ 이름 nObject!. 'ISession'"}

지금 내가 메신저 ISession 내 IContentService 인터페이스를 결합하기 때문에이 알고있다. 나는 또한 ISession이 thread-safe가 아니며 한 번만 사용할 수 있다는 것을 알고있다. 그래서 내 질문은 ... 그럼 어떻게 여러 스레드에 걸쳐 동시 적으로 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(); 

내 contentService의

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>(); } 
     } 
    } 

UPDATE

난 내가 멀티 스레딩 ISessionFactory를 사용해야하지만 난 바인딩 할 수 없습니다 읽는 방법 내가 할 수있는 것처럼.

+2

당신이 이미 [귀하의 사전 질문] (http://stackoverflow.com/questions/38596986/how-to-have에 들었다 :

UPDATE는

여기에 대한 답을 알아 냈어 nested-in-shared-session-in-nhibernate-containing-diff)를 사용하면 NHibernate 세션은 thread-safe하지 않다는 것을 알 수있다. 동일한 질문을 반복해서 묻는 것은 우주를 바꿀 것입니다. – MickyD

+0

이것에 기초 : http://stackoverflow.com/questions/7359909/nhibernate-sessionfactory-thread-safe-issue "세션 팩토리가 threadsafe이고, 세션은 다음과 같습니다. 아니." 하지만 질문은 마지막 스레드 인 멀티 스레드 세션을 만드는 방법을 묻는 질문과 다릅니다 – NeoSketo

+0

Golly, 그 링크는 어떻게 관련이 있습니까? 질문을 다르게하면 결과가 달라질 것이라고 생각하십니까? _ "[세션은 설계 상 NHibernate에서 쓰레드 안전하지 않다] (http://stackoverflow.com/a/242983/585968)"_. 그냥 받아 들여서 좋은 차 한잔을 만들어주세요. – MickyD

답변

0

i는 요청 당 세션으로 올바르게 멀티 스레딩했습니다. 문제는 NHibernate가 세션을 너무 빨리 닫는 MySQL에 큰 문제가 있다는 것입니다. 나는 그 반응에 감사한다. 이것은 분명히 설명하기 어려운 문제였습니다. Session is closed Object name: 'ISession'. at NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() - How to stop the session from closing prematurely

+0

자세한 정보에 대한 링크가 있습니까? –

+0

불행히도 이것은 스스로 발견 한 무언가입니다. 로그에서 나는 그것이 여러 세션을 생성하고있는 것을 보았습니다. 그래서 나는 쿼리를 캐싱하고 make shift queue를 만들어야 만했다. 임씨는 MySQL과 NHibernate에서이 문제가있는 유일한 사람이라는 사실에 놀라움을 금치 못했습니다. – NeoSketo

+0

물론 버그가있을 수 있습니다 - 최신 버전의 MySQL 커넥터를 사용하고 있습니까? 다른 한편으로 아무도 다른 사람이 문제를 겪고있는 것 같지 않다면, 그것은 당신의 코드 어딘가에 실제로 문제가 될 수 있다는 것을 나타냅니다. 정확히 "쿼리 및 큐 대기"등의 의미를 갖지는 않지만 실제로는해야 할 필요가없는 커다란 해결 방법처럼 들립니다. –