Что если сбой при построении фабрики сессий Nhibernate? - PullRequest
1 голос
/ 15 сентября 2009

В настоящее время я создаю систему, которая в некоторых случаях, если база данных недоступна, вместо этого использует MSMQ. Например. если приложение (в одном из случаев это веб-служба wcf) запускается и база данных недоступна, все входящие запросы должны быть записаны в MSMQ. Когда база данных снова станет доступной, запросы должны быть снова записаны в БД. Я использую NHibernate и фабрика сессий обернута синглтоном. Вот как выглядит сервис:

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

Эта настройка работает, когда служба в течение некоторого времени запущена и работает, а фабрика сеансов была построена. При остановке сервера SQL возникают исключения 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 Ответ

1 голос
/ 15 сентября 2009

Я предлагаю вам изменить свой 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;
                }
            }
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...