Как я могу заставить NHibernate пережить время простоя базы данных? - PullRequest
1 голос
/ 13 февраля 2011

У меня есть консольное приложение C #, которое я хотел бы продолжать работать, даже когда его база данных падает.В этом случае он должен опросить базу данных, чтобы узнать, когда она вернется в оперативный режим, а затем возобновить работу.У меня есть этот код, который мне не нравится:

    public static T Robust<T>(Func<T> function)
    {
        while (true)
        {
            try
            {
                return function();
            }
            catch (GenericADOException e)
            {
                Console.WriteLine("SQL Exception. Retrying in 10 seconds");
                Thread.Sleep(10000);
            }
        }
    }
    [...]
    N.Robust(() => Session.CreateCriteria(typeof(MyEntity)).List());

Проблема в том, что я должен вставлять эту надоедливую N.Robust конструкцию везде, которая загромождает код.Кроме того, я рискую где-то забыть.Я изучал использование EventListeners или Inceptors NHibernate для него, но не смог заставить его работать.Неужели мне действительно нужно форкнуть NHibernate, чтобы это работало?

Обновление Хорошо, поэтому я смог преодолеть одну из двух моих проблем.Внедрив своих собственных слушателей событий, я, по крайней мере, могу гарантировать, что все вызовы к базе данных будут проходить через вышеупомянутый метод.платить за увеличение времени безотказной работы.

1 Ответ

5 голосов
/ 13 февраля 2011

Один из архитектурных подходов, позволяющих выдерживать время простоя базы данных, состоит в использовании очереди (на стороне клиента и / или на стороне сервера).Для чтения статических или в основном статических данных кэшируйте на стороне клиента окно истечения срока действия (скажем, 15–30 минут).

Это нетривиально, если у вас сложные транзакции базы данных.

Спать, как вы предлагаете, редко бывает хорошей идеей.

Другой вариант (используемый в основном в периодически подключаемых приложениях) - использовать репликацию базы данных.Используя СУБД с поддержкой репликации (например, Sql Server), ваше приложение всегда будет взаимодействовать с локальной БД и позволит механизму репликации автоматически выполнять синхронизацию с удаленной базой данных, когда соединение установлено.Это, вероятно, представит проблему управления конфликтами / их разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...