【问题标题】:Handling Start Up Issues With NHibernate In Global.asax在 Global.asax 中处理 NHibernate 的启动问题
【发布时间】:2010-10-04 14:21:29
【问题描述】:

我有一个 WCF 服务,托管在 IIS 内,使用 NHibernate 进行数据访问。

在我的 Global.asax 中,我在 Application_Start 上配置 NHibernate。这意味着我只需为我的 WCF 服务执行一次设置所有映射的昂贵任务。

唯一的问题是,如果数据库在启动期间不可用,则永远不会设置映射(因为它们将在 Application_Start 期间设置失败,并且在应用程序之前不会再次调用该事件池被回收)。

我如何处理 NHibernate 设置,使其只发生一次,除非出现错误(例如数据库不可用),在这种情况下,它会在每次请求时发生,直到它正常工作?强>

【问题讨论】:

    标签: wcf nhibernate global-asax


    【解决方案1】:

    您需要一个 Lazy Singleton 作为您的 SessionFactory。您调用一个方法来获取会话工厂,它会检查会话是否已经存在。 所以创建会话工厂这一昂贵的任务是在有人第一次需要它时完成的

    你可以这样做:

    public ISessionFactory GetSessionFactory()
        {
            // sessionFactory is STATIC
            if (sessionFactory == null)
            {
    
                global::NHibernate.Cfg.Configuration cfg = new NHibernateConfigurationFactory(CurrentConfiguration).GetConfiguration(sessionFactoryName);
    
                //  Now that we have our Configuration object, create a new SessionFactory
                sessionFactory = cfg.BuildSessionFactory();
    
                if (sessionFactory == null)
                {
                    throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
                }
            }
    
            return sessionFactory;
        }
    

    这里有完整的解决方案:

    NHibernate - good complete working Helper class for managing SessionFactory/Session

    【讨论】:

    • 使用惰性单例时必须注意的一件事是,在构建惰性单例时可能会遇到线程问题,因为并发请求可能会争用构造并尝试使用非 null,但也未完全注册的会话。
    【解决方案2】:

    为了让 cmets 了解它,我将这个答案混为一谈 - 这个答案已通过电子邮件发送给我,但在我决定最终解决方案之前,我会感谢 SO 社区的观点......

    不要使用 Application_Start 事件,而是使用 Begin_Request 事件。将 NHibernate 会话存储在一个字段中,并在 Begin_Request 事件中检查该字段是否为空,如果是,则创建 NHibernate 会话(否则,继续使用已创建的会话)。

    因此,从本质上讲,这意味着将创建逻辑转移到我可以在“检测到会话尚未创建”的情况下从 Begin_Request 调用的方法中。

    【讨论】:

    • 好的,在 Ayende Rahien 的博客上找到了类似的解决方案,并决定采用它。我已使用模板设计模式使其可重用,因此从 Application_BeginRequest 我只是调用低音类并传入自定义位的委托。似乎是一个不错的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多