2017-07-26 112 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'上運行,那麼它會得到改進(我讀了你的整個答案,問自己「他在談論什麼瀏覽器? 「)。但是你提供了找到這些信息的方向。謝謝! –

相關問題