服务在启动时启动时数据库连接不起作用,但在手动启动时工作

时间:2009-03-26 20:42:11

标签: .net networking windows-services database-connection

我正在尝试追踪我的应用无法连接到数据库服务器的可能原因。

我有一个Windows服务,它在启动时连接到数据库。该服务在具有可靠有线网络连接的计算机上运行。它安装了启动自动,所以通常在Windows启动时启动,几乎在所有情况下都可以正常工作。

但是,对于一组XP机器(我无法控制),当服务启动时,数据库连接会因启动Windows而失败。引发标准异常:

  

System.Data.SqlClient.SqlException:An   建立时发生错误   与服务器的连接。什么时候   连接到SQL Server 2005,这个   失败可能是由于这一事实造成的   在SQL Server的默认设置下   不允许远程连接。   (提供者:SQL网络接口,   错误:26 - 错误定位   指定的服务器/实例)

在这些机器上,如果用户登录并手动启动服务,则会正确连接到数据库,这非常奇怪。所以我想在Windows启动时遇到的问题是:

  • 服务在网络连接之前启动
  • 服务在计算机连接到DNS以解析服务器名称之前启动(如果这是解析数据库服务器名称的方式)
  • 计算机上最初阻止传出连接的策略/防火墙/等
  • 别的......

当用户手动启动服务时不会发生此问题,因此必须发生一些事情来解决问题。我想这可能是一个在启动时运行但在我的服务启动时尚未完成的进程,或者是用户已登录的事实 - 可能是他们的登录脚本中的某些内容。

我无法直接访问这些机器,因此需要了解问题的原因以及识别是否正确的方法。我不能重复部署诊断程序,所以第一次需要彻底。

所以第一个问题是:有没有人知道可能导致这种情况的桌面策略,网络策略或软件?第二个问题:我能做些什么来准确诊断发生了什么?

我正在考虑创建一个新的诊断服务,该服务也将被安装为自动启动,并将执行各种操作以查看正在发生的情况,并记录此信息。例如:

  • 运行“ipconfig / all”(查看是否有网络连接)
  • 按IP地址ping数据库服务器(查看是否可以找到服务器)
  • 按名称
  • ping数据库服务器
  • 检查包含服务器名称的HKLM注册表项(如果以后更新HKLM注册表)
  • 创建与数据库的SQL连接(以查明何时开始工作)
  • 每隔几秒钟重复这些步骤。

我将安装此服务,重新启动计算机,然后在一段时间后让用户登录。诊断程序应该显示一些有用的信息......但是任何人都有更好的想法或其他建议吗?

我还尝试将服务更改为具有适当权限的用户帐户,但这并未解决问题。请注意,本地系统帐户确实有足够的priveleges连接到数据库服务器,因为手动启动时服务正常。所以它与this question不一样。

更新:麻烦的机器正在运行Win XP。

更新:this article对错误代码26进行了很好的讨论

3 个答案:

答案 0 :(得分:3)

这些机器是否可能安装了某种类型的防火墙,这些防火墙在您的服务启动时尚未启动?我遇到过一些情况,软件防火墙将完全锁定互联网连接,直到服务完全启动,并且可以正常监控流量 - 如果是这种情况,并且您的服务启动速度比防火墙快,您可以看到您的应用程序似乎是一个断开连接的网络。

答案 1 :(得分:2)

一些提示:

  1. 也许您应该将依赖从您的服务设置为另一个Windows服务(如SQL Server或DTC),以确保在您的服务启动之前启动这些服务。

  2. 另一个选项(取决于您运行的操作系统)延迟自动启动服务,请查看http://msdn.microsoft.com/en-us/magazine/cc164252.aspx

  3. 第三个选项:在第一次连接到数据库之前,只需将一些Thread.Sleep(或轮询循环)放到服务线程中。

答案 2 :(得分:2)

之前我们遇到过这个问题。我们解决问题的方法是让一个启动线程在可以与数据库建立连接之前不会退出。我们会经常尝试连接并记录我们无法连接的事实。一旦我们建立了连接,我们就会继续提供服务。

换句话说,让您的服务正常启动,但在知道它是否可以连接到数据库之前,不要让它执行任何工作。如果您决定记录每个连接失败,请务必小心,因为您可能会使用无用的日志条目填满计算机。我们会记录第一次连接失败,除非服务重新启动,否则不会再次记录。

当然,如果您的数据库始终是您的服务的本地数据库,那么更好的解决方案是创建数据库Windows服务的依赖项,但听起来您的数据库不是本地的。