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

本文关键字:windows 服务 NHibernate 我的 会话 为什么 | 更新日期: 2023-09-27 17:53:58

下面是使用fluent 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秒,下一个通话就会成功。

它为什么要那样做?我正在尝试配置每个线程的会话?

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

我会做两件事,

    连接Nlog并在windows服务方法中输出一些跟踪代码
  1. 连接NHProf并确保会话在您的UOW周围正确打开和关闭。

当我遇到会话问题时,我发现NHProf是无价的,它从来没有让我失望过。

你可以尝试NHProf 30天,Nlog是OSS