Sql server SQL Server客户端如何知道如何连接到实例?

Sql server SQL Server客户端如何知道如何连接到实例?,sql-server,database-connection,connection-string,jtds,Sql Server,Database Connection,Connection String,Jtds,当使用MS JDBC驱动程序连接到运行在端口TCP/58300上的SQL Server实例时,我意识到所有这些连接字符串都可以工作: jdbc:sqlserver://MY_SERVER\MY_INSTANCE jdbc:sqlserver://MY_SERVER\MY_INSTANCE:58300 jdbc:sqlserver://MY_SERVER:58300 我猜第一个直接连接到SQL Server默认端口,即,TCP/1433。并且,从那里,它得到了如何连接到实例的方向,建立到正确端口

当使用MS JDBC驱动程序连接到运行在端口
TCP/58300
上的SQL Server实例时,我意识到所有这些连接字符串都可以工作:

jdbc:sqlserver://MY_SERVER\MY_INSTANCE
jdbc:sqlserver://MY_SERVER\MY_INSTANCE:58300
jdbc:sqlserver://MY_SERVER:58300
我猜第一个直接连接到SQL Server默认端口,即,
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
因此,问题是:

  • SQL Server如何知道如何连接到特定实例?(假设只提供名称,而不提供端口号)
  • 如果我猜测它连接到默认端口是正确的,那么当我们在连接字符串中设置默认端口号时,为什么MS JDBC驱动程序不工作?当提供端口号时,MS JDBC驱动程序可能会忽略instanceName
jdbc:sqlserver://MY_SERVER\我的例子

jdbc:sqlserver://MY_SERVER\我的例子:58300

jdbc:sqlserver://MY_SERVER:58300

我想第一个是连接的 直接连接到SQL Server默认端口,即TCP/1433。而且,从 在那里,它得到了如何连接到实例的方向, 建立到正确端口的新连接。第二个 直接连接到正确的端口,但实例名称不正确 真的需要,这就是为什么最后一个也有效

这一点你错了:

第一个连接 直接连接到SQL Server默认端口,即TCP/1433

当您连接到默认实例时,情况是这样的,但在您的情况下,该实例名为且不位于默认端口1433上

因此,在第一种情况下,只有SQL Server browser工作时,连接字符串才会工作

在这种情况下,底层网络库要求浏览器提供端口号,并提供名称:MY_INSTANCE,而浏览器为其提供端口58300。 只知道可以连接到正确实例的IP地址和端口

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

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

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

最后一件事:如果只提供MY_SERVER,将在默认端口1433(对应于SQL SERVER的默认实例)上尝试连接,如果MY_SERVER上未安装默认实例,则连接将失败

有关SQL Server浏览器的详细信息,请参见:

jdbc:sqlserver://MY_SERVER\我的例子

jdbc:sqlserver://MY_SERVER\我的例子:58300

jdbc:sqlserver://MY_SERVER:58300

我想第一个是连接的 直接连接到SQL Server默认端口,即TCP/1433。而且,从 在那里,它得到了如何连接到实例的方向, 建立到正确端口的新连接。第二个 直接连接到正确的端口,但实例名称不正确 真的需要,这就是为什么最后一个也有效

这一点你错了:

第一个连接 直接连接到SQL Server默认端口,即TCP/1433

当您连接到默认实例时,情况是这样的,但在您的情况下,该实例名为且不位于默认端口1433上

因此,在第一种情况下,只有SQL Server browser工作时,连接字符串才会工作

在这种情况下,底层网络库要求浏览器提供端口号,并提供名称:MY_INSTANCE,而浏览器为其提供端口58300。 只知道可以连接到正确实例的IP地址和端口

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

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

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

最后一件事:如果只提供MY_SERVER,将在默认端口1433(对应于SQL SERVER的默认实例)上尝试连接,如果MY_SERVER上未安装默认实例,则连接将失败


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

回答得很好!如果您在一开始就提到SQL Server Browser是一项服务,是SQL Server的一部分,它运行在端口
UDP/1434
(我阅读了您的完整答案,问自己“他在说的浏览器是什么?”)。但是你提供了找到这些信息的方向。谢谢回答得好!如果您在一开始就提到SQL Server Browser是一项服务,是SQL Server的一部分,它运行在端口
UDP/1434
(我阅读了您的完整答案,问自己“他在说的浏览器是什么?”)。但是你提供了找到这些信息的方向。谢谢