Если ваша служба всегда запускает на том же компьютере, что и 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: служба несвоевременно отвечайте на запрос запуска или управления.
В идеале ваша служба не должна зависеть от доступности базы данных, поскольку она может работать на удаленной машине.Служба - это всегда включенный процесс, который должен терпеть периодически возникающие проблемы с подключением к базе данных.