【问题标题】:What if building Nhibernate session factory fails?如果构建 Nhibernate 会话工厂失败了怎么办?
【发布时间】:2009-09-15 10:37:46
【问题描述】:

我目前正在创建一个系统,在某些情况下,如果数据库不可用,则改用 MSMQ。例如。如果应用程序(在其中一种情况下是 wcf Web 服务)启动,并且数据库不可用,则所有传入请求都应写入 MSMQ。当数据库再次可用时,应再次将请求写入数据库。 我正在使用 NHibernate,会话工厂由单例包装。这是服务的样子:

try
{
   // to database (just an example)
   SessionProvider.Current.CurrentSession.Save...       
}
catch(NHibernate.ADOException)
{
   // to msmq
}

当服务启动并运行一段时间并且会话工厂已构建时,此设置有效。停止 SQL Server 时会引发 ADO 异常,并将内容正确写入 MSMQ。

现在我的问题。如果在第一次启动服务之前数据库不可用,则无法构建会话工厂并抛出 TypeInitializationException。我的单例会话提供程序现在已损坏。所以当数据库再次运行时,我不知何故需要一种重建会话工厂的方法。我会做那个计时器吗?就像尝试每 5 分钟重建一次?如何“重新实例化”单例?

这是我正在使用的会话提供者模式的摘录:

public sealed class SessionProvider : ISessionProvider
{
    private ISessionFactory sessionFactory;

    private SessionProvider()
    {
        sessionFactory = new Configuration().Configure().BuildSessionFactory();
    }

    public static ISessionFactory SessionFactory
    {
        get 
        {
            return Nested.SessionProvider.sessionFactory;
        }
    }

    public static ISessionProvider Current
    {
        get 
        {
            // TypeInitializationException is thrown when building session factory fails
            return Nested.SessionProvider;                                
        }
    }

    private class Nested
    {
        internal static readonly SessionProvider SessionProvider = new SessionProvider();
    }
}

【问题讨论】:

  • 1.您可以完整发布错误(可能带有堆栈跟踪吗?)。也许可以解决 nh init 错误。 2.您的 SessionProvider() 每次使用时都会重新构建 sessionFactory,正如 Beatles1692 所指出的那样进行重构。 3.如果发生异常,您的单例不会损坏。对于初始化工作的 SessionProvider() 的每个后续调用,您的应用程序将正常工作

标签: nhibernate


【解决方案1】:

我建议你像这样改变你的 SessionProvider:

...     
       private ISessionFactory sessionFactory;
       private Configuration config;

            private SessionProvider()
            {
                config= new Configuration();
                config.Configure();
            }


        public static ISessionFactory SessionFactory
            {
                get 
                {
                    if(sessionFactory==null)
                       sessionFactory=config.BuildSessionFactory();

                        return Nested.SessionProvider.sessionFactory;
                }
            }
...

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2011-04-26
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多