2011-09-22 22 views
2

我想在Windows服务中使用nHibernate。如果系统启动,它可能会在数据库之前启动我的服务。在这种情况下,nHibernate配置失败并且服务崩溃。所以现在我想知道如何检查数据库服务是否已经启动。如果它尚未开始,我的服务应稍等一会,稍后再试。在Windows服务中使用nHibernate

回答

4

如果您的服务始终运行在同一台计算机的SQL Server上,您应该使用ServiceInstaller.ServicesDependedOn告诉视窗(SCM),你依靠“MSSQLSERVER”(服务运行SQL Server的名称)。

MSDN

服务可能需要其他服务运行之后才能开始 。来自此属性的信息将写入 注册表中的密钥。当用户(或系统,在自动启动 的情况下)尝试运行该服务时,服务控制管理器(SCM) 验证阵列中的每个服务已经启动了 。

ServiceInstaller是使用InstallUtil当它安装到您的服务的类。其他安装包,包括InstallShield,也支持这个窗口功能。等效SC command

因此,您的服务将只在SQL Server已经运行之后启动。但即使在这种情况下,将所有可能长时间运行的启动过程卸载到后台线程仍然是一个好主意。在OnStart方法中尽可能少。理想情况下,你只需要生成一个新的初始化线程来处理NHibernate会话工厂初始化。如果由于某种原因,你还是想这样做处理通信,那么你应该考虑重试NHibernate的初始化,并呼吁ServiceBase.RequestAdditionalTime避免:

错误1053年:服务没有启动或控制及时回应 请求时尚。

理想情况下,您的服务不应该依赖于数据库的可用性,因为它可能在远程计算机上运行。该服务是一个“永远在线”的过程,应该容忍间歇性的数据库连接问题。

+0

当你的数据库和应用服务器不同时会发生什么?这个解决方案仍然有效吗? –

+0

看到我最后的编辑。 – Dmitry

0

如果有更好的方法,不知道,但在服务启动时检查系统的正常运行时间。如果这少了那么让我们说5分钟,等待(5分钟 - 正常运行时间),然后像平常那样开始其他服务。

Calculating server uptime gives "The network path was not found"

下面这不是一个解决方案然而,当你的服务会尝试连接到SQL这是下跌的,但是如果发生这种情况,你要处理的异常,居然被通知SQL正在下降。你很可能不希望服务在没有你的情况下继续尝试,你自己知道SQL是关闭的。

0

您可以使用ServiceController类并调用其静态方法GetServices()来获取服务列表。它将提供一系列服务,找到合适的服务并检查其状态。

ServiceController MSDN上

0

目前,我确保我可以建立所需的数据库和运行默认查询(配置)的连接。如果这是成功的,我继续开始服务。

我发现在某些情况下,即使MSSQL服务已启动,它也不能保证您可以连接到它并对其执行查询。