2016-07-27 6 views
-3

私は、MVC C#アプリケーションでNInject MVC5を使用してNHibernateを実装しました。すべて正常に機能しますが、私は自分のリンクをダブルクリックすると常にエラーが発生することに気付きました: {"最初に閉じる必要のあるこのConnectionに関連付けられているこのDataReaderはすでに開かれています"} または複数のリクエストに対してMySQLを使用してNHibernateでセッションをマルチスレッドする方法は?

は{ "セッションが閉じられ、\ rを\ nObject名前:! 'ISession'"}

今私はイムはISessionに私のIContentServiceインターフェースを結合するので、これは知っています。私はまた、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(); 

マイ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を使用する必要がありますが、私はそれをバインドすることができませんでしたどのように読んで私はISessionできるように。

+2

あなたは既に[あなたの前の質問](http://stackoverflow.com/questions/38596986/how-to-haveに言われた:

UPDATEは

は、ここに答えを考え出しましたセッションのスレッドセーフではない(ここで知っていたことを認めています)。何度も同じ質問をすることはユニバースを変更するつもりはない – MickyD

+0

これに基づいて:http://stackoverflow.com/questions/7359909/nhibernate-sessionfactory-thread-safe-issue "セッションファクトリはスレッドセーフで、セッションはそうではありません。しかし、質問は、マルチスレッドセッションを作成する方法を尋ねる最後のものとは異なります – 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

残念ながら、これは私が自分で見つけたものです。ログには、複数のセッションが作成されていることがわかりました。だから、私はクエリをキャッシュし、メイクシフトのキューを作る必要があった。私はMySQLとNHibernateでこの問題を抱えている唯一の人です。 – NeoSketo

+0

もちろん、バグの可能性があります - あなたはmysqlコネクタの最新バージョンを使用していますか?一方、他の誰も問題を抱えていないように見える場合、それは実際にあなたのコードのどこかで問題になる可能性があることを示しています。私はあなたが「クエリやキューをキャッシュする」などとはまったく同じ意味を持っていませんが、本当にやらなければならない巨大な回避策のように私には聞こえます。 –

関連する問題