连接 SQL Server 初次连接很慢,为什么?

16
我遇到了一个问题,涉及到两个站点安装的C#应用程序。连接SQL Server时,最初的连接非常缓慢。我编写了一个测试应用程序来验证减速发生在哪里,发现是在第一个SQLConnection.Open语句上。通过命名管道连接到服务器需要约41秒钟,我们认为可能是DNS问题,但使用TCP / IP连接速度同样缓慢。首次连接建立后,连接会被池化,并且应用程序会正常响应。工作站和服务器都是运行Windows 7 Pro的像样机器,采用Core 2 Duo 3.16 GHz处理器和4 GB内存。我在微软论坛上找到了以下文章:http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/f295994c-5812-4e46-8ac9-f05471d4dd54关闭LLMNR协议将初始连接时间减少了一半,约21秒钟。然而,这仍然是一个很长的时间来连接SQL Server。与我们平常不同的唯一小差别是,在这种情况下,DNS是通过路由器而不是实际服务器完成的。到目前为止,这已经发生在仅有的两个地方,其他地方没有问题。谢谢,Dennis。

正在使用SQL身份验证,而不是Windows身份验证,并且未使用SSL。 - user281677
15个回答

11
在连接字符串之前加上np:可以强制使用命名管道而不是默认的TCP协议。这样连接字符串变成了Server=np:server\instance
我本可以将优先级更改为在使用TCP之前使用命名管道,但我不想在服务器上进行更改。

如果服务器是本地的,你应该使用命名管道,但这似乎仍然是一种变通方法。我猜你可能有一些与TCP设置相关的问题,可能需要出于其他原因进行修复。 - dnaq
虽然不是理想的情况,但我被逼无奈只能选择这种方式,而且对我来说有效。我做过更糟糕的事情。 - Wade Hatler
这对我很有效。想到只需在连接字符串中添加三个字符就能产生如此大的差异。FYI,我们的服务器是Windows 8,终端运行Windows 7。 - WonderWorker
@Perry Patterson - 你能在你的回答中提供一个完整的连接字符串示例吗? - KnightFox
这对我在Windows SBS 2011上使用SQL Server 2012解决了神秘的延迟问题。 - Tschallacka
使用服务器名称而不是IP地址对我也起作用了(Sql Server 2019)。 - sintetico82

5
我看到类似的问题,但不确定是否与你的问题相同。在我的情况下,不仅是C#程序连接SQL变慢,任何连接SQL服务器的工具都会遇到缓慢的情况。而且,一旦与SQL服务器建立起初始连接,在一段时间内,任何后续连接都很好。
原因是SQL服务器使用了多个托管程序集。它正在尝试验证分配给这些程序集的证书。它正在连接crl.microsoft.com。我的SQL服务器没有互联网连接。所以,它等待超时。
解决方案是让我的SQL服务器拥有互联网访问权限或禁用CRL检查。您可以转到SQL服务器机器。选择“工具”>“Internet选项”>“高级”。检查安全节点下的发布者证书吊销是否已经被选中。如果选中,请取消选中。

1
这帮助我将延迟从9秒减少到4秒。但仍有一些问题。 - bh_earth0

4
我尝试使用 integrated security = false(表示用户ID和密码在连接字符串中)以及 encrypt = false(只是为了确保不使用 SSL 加密)来指定连接字符串。但是,这些规格说明似乎没有起到帮助作用,我无法显式地使用 TCP/IP 网络库(NetworkLibrary = "dbmssocn")建立连接。这可能与服务器防火墙以及端口未开放有关。我切换回命名管道,并将命名管道网络库规范放入连接字符串中(NetworkLibrary = "dbnmpntw")。更改后,连接立即建立。

这是我自己的修复方法,谢谢大家的贡献。Dennis - user281677

2

使用IP地址(而不是主机名)建立与SQL Server的集成安全连接,将防止使用Kerberos身份验证。在这种情况下,请检查SQL Server和域控制器之间的连接。

如果使用主机名(而不是IP地址)进行连接,则会启用Kerbos,在这种情况下,您需要检查客户端计算机与域控制器之间的连接。


1

我们曾经遇到过同样的问题,后来发现是由于我们远程托管的Active Directory服务器出了问题。

我们创建了一个站点本地的Active Directory服务器来复制远程托管的AD主服务器,然后我们所有缓慢的SQL Server集成安全认证性能问题都得到了解决。

希望这可以帮到你。


1

是的,当您使用集成安全性时,可能会归咎于Active Directory,也可能是整个网络,因为它完全取决于它。我能想到的另一件事是您正在使用的SQL Server版本。

此外,当SQL Server长时间未被使用时,它的行为类似于IIS,将工作进程置于睡眠状态,因此当您再次联系服务器时,根据机器(我们可以看到这些具有桌面机器配置),需要一些时间才能使工作进程恢复生机并准备好工作。


1
你是否已经检查过了显而易见的问题?防火墙上是否打开了UDP端口1434,浏览器服务是否正在运行...否则身份验证可能需要大约40秒钟。

1

我曾经遇到过同样的问题。在Google和Stackoverflow上进行了大量的研究后,我更改了客户端计算机的hosts文件(在Windows中位于C:\ Windows \ System32 \ drivers \ etc)。我在此文件中输入了我的主机IP地址和服务器名称,然后就万事大吉了! 就像Stackoverflow上的每个人所说的那样,是计算机在DNS服务中查找服务器名称的地址并超时了。 以下是我所做的步骤。如果其他方法都不起作用,请尝试一下。

如何在hosts文件中添加条目


1.打开命令提示符并ping您的服务器,这是远程数据库所在的位置。要做到这一点,请输入以下命令:

ping servername

这里我的远程计算机名称是Juno。所以我应该这样ping。

ping Juno

这个命令将会ping我的服务器并返回像这样的IP地址。

Pinging Juno [192.168.0.3] with 32 bytes of data:

如您所见,服务器的IP地址位于括号之间。复制IP地址。

2.现在使用以管理员身份运行的记事本打开Hosts文件。

在hosts文件的末尾,会有一些类似于这样的行:

    #localhost name resolution is handled within DNS itself.
    #   127.0.0.1       localhost
    #   ::1             localhost

在底部(这里是 localhost 之后),输入 #,然后输入刚刚获取的服务器 IP 地址前面加上服务器名称。因此,hosts 文件应该像这样。
# localhost name resolution is handled within DNS itself.
#   127.0.0.1       localhost
#   ::1             localhost
#   169.254.63.1    Juno
  1. 现在保存hosts文件并重新启动客户端电脑。(对我来说,无需重新启动即可立即生效。)

就是这样!

要了解有关编辑hosts文件的更多信息,请单击此处


0

这可能是连接或认证方面的问题,通常第一次连接需要更长时间,因为ADO.NET具有连接池来避免长时间的连接。

有许多因素会影响速度: - TCP/IP配置 - 服务器端路由器 - 等等。


0

我没有一个确切的答案,但你尝试过使用SQL Profiler运行来查看SQL的视角吗?

另外,你尝试使用与你连接相同的凭据连接到SQL吗?

另一方面,这可能是更低级别的问题,但我总是先检查易于检查的东西。

祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接