为什么我的NHibernate会话有时只在Windows服务中可用?

时间:2013-01-17 02:11:54

标签: c# nhibernate session threadpool structuremap

以下是使用流畅的StructureMap

的NH的相关配置
ISessionFactory sessionFactory = fluentConfig.BuildSessionFactory();

For<Configuration>().LifecycleIs(new HybridLifecycle()).Singleton().Use(configuration);

For<ISessionFactory>().LifecycleIs(new HybridLifecycle()).Singleton().Use(sessionFactory);

For<ISession>().LifecycleIs(new ThreadLocalStorageLifecycle())
            .Use(x => x.GetInstance<ISessionFactory>().OpenSession());

For<IUnitOfWork>().LifecycleIs(new ThreadLocalStorageLifecycle())
            .Use<UnitOfWork>();

NH会话封装在UnitOfWork对象中。

在我的Windows服务中,每次访问会话时,它都在一个调用会话的线程池线程中,如下所示:

unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>();
  ...
  //Init repositories with the unitOfWork
  //Have repos do their thing
  ...
unitOfWork.Commit();
unitOfWork.Dispose();

当我测试上述功能时,它总是在我第一次启动应用程序时起作用,但在任何其他时间随机工作。它不起作用的时间,因为会话为空。我发现如果我在上一次通话结束后等待大约30秒,下一次通话将会成功。

为什么会这样做?我正在尝试为每个线程配置会话?

1 个答案:

答案 0 :(得分:3)

我会做两件事,

  1. 连接Nlog并在Windows服务方法中输出一些跟踪代码
  2. 连接NHProf并确保会话在您的UOW周围正确打开和关闭。
  3. 当我遇到会话问题时,​​我发现NHProf非常宝贵,它从未让我失望。

    您可以试用NHProf 30天,Nlog是OSS