SQL 服务器客户端如何知道如何连接到实例?

How SQL Server clients know how to connect to an instance?

当使用 MS JDBC 驱动程序连接到端口 TCP/58300 上的 SQL 服务器实例 运行 时,我意识到所有这些连接字符串都有效:

jdbc:sqlserver://MY_SERVER\MY_INSTANCE
jdbc:sqlserver://MY_SERVER\MY_INSTANCE:58300
jdbc:sqlserver://MY_SERVER:58300

我猜第一个直接连接到SQL 服务器默认端口,即TCP/1433。并且,从那里,它会获得有关如何连接到实例、建立到正确端口的新连接的说明。第二个直接连接到正确的端口,实际上不需要实例名称,这就是为什么最后一个也可以工作的原因。

但是,此连接字符串 不起作用:

 jdbc:sqlserver://MY_SERVER\MY_INSTANCE:1433

我收到登录失败错误(显然是因为我无法连接到端口 TCP/1433 上的实例 运行)。

当使用 jTDS JDBC 驱动程序时,当您有一个实例名称时,端口似乎并不重要。即使是随机和无效的端口也能正常工作:

 jdbc:jtds:sqlserver://MY_SERVER:1433;instance=MY_INSTANCE
 jdbc:jtds:sqlserver://MY_SERVER:58300;instance=MY_INSTANCE
 jdbc:jtds:sqlserver://MY_SERVER:12345;instance=MY_INSTANCE
 jdbc:jtds:sqlserver://MY_SERVER:9999999;instance=MY_INSTANCE

所以问题是:

jdbc:sqlserver://MY_SERVER\MY_INSTANCE

jdbc:sqlserver://MY_SERVER\MY_INSTANCE:58300

jdbc:sqlserver://MY_SERVER:58300

I guess that the first one connects directly to the SQL Server default port, that is, TCP/1433. And, from there, it get directions on how to connect to the instance, establishing a new connection to the right port. The second one connects directly to the right port and the instance name is not really needed, this is why the last one also works.

这一项你错了:

the first one connects directly to the SQL Server default port, that is, TCP/1433

当您连接到 默认实例 时是这样,但在您的情况下实例是 named 并且它不位于默认端口 1433

所以在第一种情况下,您的连接字符串只有在 SQL 服务器浏览器工作时才能工作。

在这种情况下,底层网络库向浏览器询问提供名称的端口号:MY_INSTANCE,浏览器给它端口号 58300。 只知道 IP 地址和端口就可以连接到正确的实例

尝试停止浏览器,您的第一个连接字符串将会失败。

在第二种情况下,您提供了端口,在这种情况下,实例名称根本没有用(冗余),您可以将其替换为 bla-bla-bla,但连接仍然会成功:尝试 jdbc:sqlserver://MY_SERVER\bla-bla-bla:58300

在第三种情况下,您提供了正确的连接字符串,即使在浏览器停止时也能正常工作,并且它提供了所需的内容,没有多余的实例名称。

最后一件事:如果你只提供MY_SERVER,连接会在SQL服务器的默认实例对应的默认端口1433上尝试,如果没有默认会失败实例安装在 MY_SERVER

有关 SQL 服务器浏览器的更多信息,请点击此处:SQL Server Browser Service