Использование nHibernate в службе Windows - PullRequest
2 голосов
/ 22 сентября 2011

Я хочу использовать nHibernate в службе Windows.Если система загружается, она может запустить мой сервис до базы данных.В этом случае конфигурация nHibernate завершается сбоем и происходит сбой службы.Так что теперь мне интересно, как я могу проверить, запущена ли служба базы данных.Если он еще не запущен, мой сервис должен немного подождать и повторить попытку позже.

Ответы [ 4 ]

4 голосов
/ 22 сентября 2011

Если ваша служба всегда запускает на том же компьютере, что и SQL Server , вы должны использовать ServiceInstaller.ServicesDependedOn, чтобы сообщить Windows (SCM), что вы зависите от ' MSSQLSERVER ' (имя службы, на которой выполняется SQL Server).

От MSDN :

Служба может требовать запуска других служб перед ее запуском.Информация из этого свойства записывается в ключ в реестре.Когда пользователь (или система, в случае автоматического запуска) пытается запустить службу, диспетчер управления службами (SCM) проверяет, что каждая из служб в массиве уже запущена.

ServiceInstaller - это класс, который используется InstallUtil при установке вашей службы.Другие установочные пакеты, включая InstallShield, также поддерживают эту функциональность Windows.Эквивалентная команда SC .

Таким образом, ваша служба будет запускаться только после запуска SQL Server.Но даже в этом случае, возможно, будет хорошей идеей перенести все потенциально долго выполняющиеся процедуры запуска в фоновый поток.Делайте как можно меньше в методе OnStart.В идеале вы бы просто создали новый поток инициализации, который позаботится об инициализации фабрики сеансов NHibernate.Если по каким-то причинам вы все еще хотите сделать это в OnStart, вам следует повторить попытку инициализации NHibernate и вызвать ServiceBase.RequestAdditionalTime , чтобы избежать:

Ошибка 1053: служба несвоевременно отвечайте на запрос запуска или управления.

В идеале ваша служба не должна зависеть от доступности базы данных, поскольку она может работать на удаленной машине.Служба - это всегда включенный процесс, который должен терпеть периодически возникающие проблемы с подключением к базе данных.

0 голосов
/ 22 сентября 2011

Вы можете использовать класс ServiceController и вызвать его статический метод GetServices (), чтобы получить список сервисов.Он предоставит множество сервисов, найдет нужный и проверит его статус.

См. ServiceController на MSDN

0 голосов
/ 22 сентября 2011

В настоящее время я проверяю, могу ли я установить соединение с необходимой базой данных, и выполняю запрос по умолчанию (настраивается). Если это успешно, я продолжаю запускать сервис.

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

0 голосов
/ 22 сентября 2011

Понятия не имею, если есть лучшие способы, но при запуске службы проверьте работоспособность системы.Если это меньше, скажем, 5 минут, подождите (5 минут - время безотказной работы) и после этого запустите остальную часть службы, как обычно.

См. Следующее для Расчет времени работы сервера дает "Сетевой путь не найден "

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

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