【问题标题】:Why is my NHibernate session available only sometimes in a windows service?为什么我的 NHibernate 会话有时只能在 Windows 服务中使用?
【发布时间】:2013-01-18 01:25:05
【问题描述】:

这里是使用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 秒,下一次通话就会成功。

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

【问题讨论】:

  • 不作为 Windows 服务运行时它的工作情况如何? (即你的开发机器?) - 两者有什么不同?
  • @wal 存储库代码通常在 Web 应用程序中运行,但需要在 Windows 服务中批量处理一些数据。我在这个新环境中设置时遇到了麻烦(我没有设置 web 项目,而且 NH 和 StructureMap 对我来说相当陌生,尤其是因为大多数文档都是如何在 web 应用程序中使用它们)。

标签: c# nhibernate session threadpool structuremap


【解决方案1】:

我会做两件事,

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

当我遇到会话问题时,​​我发现 NHProf 非常宝贵,它从未让我失望。

NHProf可以试用30天,Nlog是OSS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多