2017-07-26 111 views
0

当使用MS JDBC驱动程序连接到端口TCP/58300运行的SQL Server实例,我意识到,所有这些连接字符串的工作: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 Driver时,当你有一个实例名时,端口似乎并不重要。即使是随机的,无效的港口工程,以及:

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服务器如何知道如何连接到特定的实例? (假设你只提供一个名称,而不是一个端口号)
  • 如果我正确地猜测它连接到默认端口,为什么当我们在连接字符串中设置默认端口号时,MS JDBC驱动程序不起作用?也许MS JDBC驱动程序在提供端口号时忽略instanceName?

回答

2

的jdbc:SQLSERVER:// MY_SERVER \ MY_INSTANCE

的jdbc:SQLSERVER:// MY_SERVER \ MY_INSTANCE:58300

的jdbc:SQLSERVER:// MY_SERVER:58300

我猜测第一个将 直接连接到SQL Server默认端口,即TCP/1433。然后从 那里,它得到如何连接到实例的指导, 建立到正确端口的新连接。第二个 直接连接到正确的端口和实例名称不是 确实需要,这就是为什么最后一个也可以。

你错了,在这一个:

第一个连接 直接到SQL Server的默认端口,也就是TCP/1433

它是如此,当你连接到默认实例,但在你的情况下,实例是,名为,它不在上的默认端口1433

因此,在第一种情况下,只有在SQL Server浏览器有效时,连接字符串才能工作。

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

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

在您提供的端口,在这种情况下,实例名称是没用的所有(冗余)第二种情况下,你可以用喇嘛喇嘛,喇嘛代替它,但连接仍然会成功:尽量jdbc:sqlserver://MY_SERVER\bla-bla-bla:58300

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

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

更多关于SQL Server Browser的信息请见:SQL Server Browser Service

+0

很好的答案!如果你在开始时引用SQL Server Browser是一个服务,它是SQL Server的一部分,它在端口'UDP/1434'上运行,那么它会得到改进(我读了你的整个答案,问自己“他在谈论什么浏览器? “)。但是你提供了找到这些信息的方向。谢谢! –

相关问题