如果构建Nhibernate会话工厂失败怎么办?

时间:2009-09-15 10:37:47

标签: nhibernate

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

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

当服务启动并运行一段时间并且会话工厂已构建时,此设置有效。停止SQL服务器时,会引发异常,并将正确的内容写入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 个答案:

答案 0 :(得分: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;
                }
            }
...