0

这里

当 SQL Server 客户端请求 SQL Server 资源时,客户端网络库使用端口 1434 向服务器发送一条 UDP 消息。SQL Server 浏览器使用所请求实例的 TCP/IP 端口或命名管道进行响应。

显然,当 UDL 或 SSMS 用于远程连接到 SQL Server 实例名称时,解析实例名称的端口号的查询存储在客户端计算机的某个位置。

我用两台客户端机器对此进行了测试。当 1434 UDP 端口打开时,第一台机器可以连接到 SQL Server 实例名称。然后我关闭了端口并用那台机器再次尝试。第一个客户端仍然可以在没有打开端口的情况下连接。然后我尝试使用第二台机器,但无法连接。

我只是想知道这种缓存是如何以及在哪里发生的?

4

1 回答 1

1

像 SqlClient 这样的客户端 API 默认使用连接池来避免每次打开连接时的名称解析、物理网络连接和身份验证的开销。当初始连接关闭时,该连接将被添加到连接池中,下次打开具有相同属性的另一个连接时可以重用该连接池。在这种情况下,客户端 API 只是从池中检索和未使用的连接,避免了建立物理连接的大量开销。

使用命名实例,连接池还避免了每次打开连接时都需要查询 SQL Server Browser 服务,因此这解释了您的观察结果。我怀疑如果您在阻止 UDP 端口 1434 后退出并重新启动应用程序,则命名实例的 SQL 连接将由于在初始连接打开期间 SQL Server Browser 数据报查询失败而失败。

于 2018-12-23T23:48:19.200 回答