【问题标题】:Initial connection to SQL Server Connection Is Slow. Why?与 SQL Server 连接的初始连接速度很慢。为什么?
【发布时间】:2010-11-24 16:45:53
【问题描述】:

我在两个站点上安装了一个 C# 应用程序,在这些站点与 SQL Server 的初始连接非常缓慢。我编写了一个测试应用程序来验证减速发生的位置以及它在第一个 SQLConnection.Open 语句上。通过命名管道建立与服务器的连接大约需要 41 秒。我们认为这可能是 DNS 问题,但使用 TCP/IP 连接时速度也一样慢。建立初始连接后,连接被池化,应用程序正常响应。工作站和服务器都是运行 Windows 7 Pro、Core 2 Duo 3.16 Ghz 和 4 gig 内存的不错的机器。我确实在微软论坛上找到了以下文章:

http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/f295994c-5812-4e46-8ac9-f05471d4dd54

关闭 LLMNR 协议确实将初始连接时间缩短了大约一半至 21 秒。但是,要获得与 SQL Server 的初始连接仍然需要很长时间。与我们的标准稍有不同的是,在这种情况下,DNS 是通过路由器而不是实际服务器完成的。到目前为止,这仅发生在两个地方,其他地方运行没有问题。任何帮助将不胜感激。

谢谢你, 丹尼斯

【问题讨论】:

  • 使用的是SQL认证,不是windows认证,也没有使用SSL。

标签: c# sql-server-2005 ado.net connection


【解决方案1】:

在服务器连接字符串前面,添加np:

这变为Server=np:server\instance 并强制使用命名管道而不是默认的 TCP。

我可能会更改优先级以在 TCP 之前使用命名管道...但我不想在服务器上搞乱它。

【讨论】:

  • 如果服务器是本地的,您应该使用命名管道,但这似乎仍然是一种解决方法。我猜您的 TCP 设置存在某种问题,可能由于其他原因需要修复。
  • 并不总是理想的,但我被困在一块岩石和一个坚硬的地方之间,它对我有用。我做得更糟。
  • 这对我有用。想想只是在连接字符串中添加三个字符会产生这样的差异。仅供参考,我们的服务器是 Windows 8,终端运行的是 Windows 7
  • @Perry Patterson - 您能否在答案中提供一个包含完整连接字符串的示例?
  • 这解决了我在带有 sql server 2012 的 windows sbs 2011 上的神秘滞后
【解决方案2】:

我看到了类似的问题,但不确定它是否与您的相同。就我而言,不仅仅是 C# 程序建立 SQL 连接速度慢。任何连接到 SQL Server 的工具也会遇到缓慢的问题。此外,一旦与 SQL 服务器建立初始连接,任何后续连接都可以在一段时间内正常运行。

原因是 SQL Server 使用了许多托管程序集。它正在尝试验证分配给程序集的证书。它正在连接 crl.microsoft.com。我的 SQL 服务器没有互联网连接。所以,它等待超时。

解决方案是让我的 SQL 服务器能够访问 Internet 或禁用 CRL 检查。您可以转到 SQL 服务器计算机。选择工具 > Internet 选项 > 高级。检查是否检查了安全节点下的发布者证书吊销。如果已选中,请取消选中。

【讨论】:

  • 这帮助我将延迟从 9 秒减少到 4 秒。还是有东西的。
【解决方案3】:

我尝试使用集成安全 = false (意味着用户 ID 和密码在连接字符串中)和 encrypt = false 指定连接字符串(只需 100% 确定没有使用 SSL 加密)。这些规范似乎没有帮助,我无法使用 TCP/IP 网络库 (NetworkLibrary = "dbmssocn") 显式获得连接。这可能与服务器防火墙和端口未打开有关。这次我切换回了命名管道,并将命名管道网络库规范放在了连接字符串中(NetworkLibrary = "dbnmpntw")。更改后,立即建立连接。

【讨论】:

  • 这是我自己解决的问题,谢谢大家的意见。丹尼斯
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我们遇到了同样的问题,结果是我们远程托管的 Active Directory 服务器应该受到指责。

    我们创建了一个站点本地 Active Directory 服务器来复制远程托管的 AD 主服务器,然后我们所有的慢速 SQL Server 集成安全身份验证性能问题都消失了。

    希望对你有帮助。

    【讨论】:

      【解决方案6】:

      是的,当您使用集成安全性时,Active Directory 可能是罪魁祸首,整个网络也是如此,因为这一切都取决于它。我能想到的另一件事是您正在使用的 SQL Server 版本。

      另外,当 SQL Server 长时间不使用时,它的行为类似于 IIS,使工作进程进入睡眠状态,所以当你再次联系服务器时,取决于机器(我们可以看到这些有台式机配置),工作进程恢复并准备好工作需要一些时间。

      【讨论】:

        【解决方案7】:

        你确实检查了我认为的明显内容?该 UDP 端口 1434 在防火墙上打开并且浏览器服务正在运行....否则需要大约 40 秒才能进行身份验证。

        【讨论】:

          【解决方案8】:

          还有其他方法可以创建到 SQL 数据库的连接。尝试查找使用

          的教程

          sqlconnection myCon = new sqlconnection(details);

          myCon.Open()
          

          而不是创建一个对象来实例化连接。

          【讨论】:

            【解决方案9】:

            我没有具体的答案,但您是否尝试过运行 SQL Profiler 从 SQL 的角度查看发生了什么?

            您是否尝试过使用与您的连接相同的凭据连接到 SQL?

            另一方面,它可能都低得多,但我总是先做容易检查的东西。

            祝你好运。

            【讨论】:

              【解决方案10】:

              听起来名称解析需要一段时间或身份验证需要一段时间。在初始解析或身份验证发生后,端点的详细信息由服务器缓存,因此在缓存过期之前无需再次执行查找。

              作为一个实验,尝试从客户端 ping 服务器 - 如果这需要很长时间才能解析主机名,那么您找到了罪魁祸首:主机名查找(DNS 或 NBNS)。另一种选择是使用主机 IP 地址而不是名称。因此,如果您在服务器 sql2005-01 上有一个名为 bob 的 SQL Server 实例,并且该服务器的 IP 为 192.168.200.12,那么请尝试连接到 192.168.200.12\bob 而不是 sql2005-01\bob

              身份验证更难解决,但您可以在 SQL 服务器框上使用 runas 对其进行测试(例如,runas /user:domain\user cmd 以查看您是否可以作为您尝试身份验证的用户打开命令提示符.

              【讨论】:

                【解决方案11】:

                这很容易是连接或身份验证的问题,第一次连接需要更长的时间是正常的,因为 ADO.NET 有连接池以避免连接时间过长。

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

                【讨论】:

                  【解决方案12】:

                  如果您仍然遇到问题,请查看解决方案:

                  根本原因

                  我们在 Win7 VDI 上看到的问题可能是由于与机器连接的网络硬件设备造成的。如果网络设备不支持 TCP/IP 缩放,那么性能会很慢。

                  解决方案

                  禁用 TCP 的自动调整级别。请按照以下步骤操作: 1)以管理员权限打开命令提示符(以管理员身份运行) 2) 输入“netsh interface tcp set global autotuninglevel=disabled” 3) 运行上述命令后重启机器。

                  有关此命令的其他信息,请访问链接“http://support.microsoft.com/kb/935400”

                  【讨论】:

                    【解决方案13】:

                    我遇到了同样的问题。在对 google 和 stackoverflow 进行了深入研究之后,我更改了客户端计算机的主机文件(在 windows 中,位于 C:\Windows\System32\drivers\etc)。我在这个文件和 Viola! 中输入了我的主机的 IP 地址和服务器名称。事情变得超快! 就像 stackoverflow 中的每个人所说的那样,是计算机在 DNS 服务中查找服务器名称的地址并超时。 我做的步骤如下。如果没有其他工作,请尝试一下。

                    如何在主机文件中添加条目


                    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. 现在保存主机文件并重新启动客户端 PC。 (对我来说,它无需重启即可立即运行。)

                    然后就可以了!

                    For more info about editing your hosts file,click here

                    【讨论】:

                      【解决方案14】:

                      就我而言,答案是:

                      • 尝试一切都没有结果。
                      • 将桌面远程连接到(非产品)SQL Server 以仔细检查设置。
                      • 关闭您在完成快速 SSIS 作业后继续运行的 Visual Studio。
                      • 去安静的地方踢自己一脚。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-11-10
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-12-08
                        相关资源
                        最近更新 更多