連線到 Azure SQL 資料庫
本文討論使用 Microsoft JDBC Driver for SQL Server 連線到 Azure SQL Database 時發生的問題。 如需連線到 Azure SQL Database 的詳細資訊,請參閱:
詳細資料
若要連線到 Azure SQL Database,您應連線至 master 資料庫以呼叫 SQLServerDatabaseMetaData.getCatalogs。
Azure SQL Database 不支援從使用者資料庫傳回整組目錄。 SQLServerDatabaseMetaData.getCatalogs 會使用 sys.databases 檢視來取得目錄。 請參閱 sys.databases (Transact-SQL) 中關於權限的討論,以了解 Azure SQL Database 上的 SQLServerDatabaseMetaData.getCatalogs 行為。
登入逾時
連線到 Azure SQL Database 時,建議的預設 loginTimeout
為 30 秒。 如果您要連線到無伺服器執行個體,建議您使用 60 秒以上的較長 loginTimeout
。 如果無伺服器執行個體已閒置,可能需要一些時間來喚醒初始連線。 如需如何設定 loginTimeout
的詳細資訊,請參閱設定連線屬性。
連線中斷
連線到 Azure SQL Database 時,網路元件 (例如防火牆) 可能會在一段時間沒有活動之後終止閒置連線。 在此內容中,有兩種閒置連接類型:
TCP 層閒置,其中任何數目的網路裝置都可能會卸除連接。
因 Azure SQL 閘道而閒置,可能會出現 TCP 保持運作訊息 (使連線從 TCP 觀點而言未閒置),但在 30 分鐘內沒有使用中查詢。 在此狀況下,閘道會在 30 分鐘時判定 TDS 連線閒置並結束連線。
若要解決第二點並避免閘道終止閒置連線,您可以:
使用重新導向連線原則來設定您的Azure SQL 資料來源。
透過輕量活動讓連線保持作用中狀態。 不建議使用此方法,應只在沒有其他可能的選擇時使用。
若要解決第一點並避免網路元件卸除閒置連線,請在載入該驅動程式的作業系統上設定下列登錄設定或其非 Windows 的對等項目:
登錄設定 | 建議值 |
---|---|
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime | 30000 |
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval | 1000 |
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions | 10 |
重新啟動電腦,讓這些登錄設定生效。
KeepAliveTime 與 KeepAliveInterval 值是以毫秒為單位。 這些設定會導致 10 到 40 秒內沒有回應的連線中斷連線。 如果在傳送「保持運作」封包之後沒有收到任何回應,則會每秒重試一次,最多 10 次。 如果在這段時間內沒有收到任何回應,就會中斷用戶端通訊端的連線。 視環境而定,建議您增加 KeepAliveInterval 以配合可能導致伺服器超過 10 秒無法回應的已知中斷情形 (例如虛擬機器移轉)。
注意
在 Windows Vista 或 Windows 2008 與更新版本上,無法控制 TcpMaxDataRetransmissions。
若要在 Azure VM 中加以設定,請建立啟動工作以新增登錄機碼。 例如,您可以將下列啟動工作加入至服務定義檔:
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
然後,將 AddKeepAlive.cmd 檔案加入至您的專案。 將 [複製到輸出目錄] 設定設為 [永遠複製]。 下列指令碼是範例 AddKeepAlive.cmd 檔案:
if exist keepalive.txt goto done
time /t > keepalive.txt
REM Workaround for JDBC keep alive on Azure SQL
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmissions /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done
將伺服器名稱附加至連接字串中的 userId
在 Microsoft JDBC Driver for SQL Server 4.0 版之前,若要連線到 Azure SQL Database,您必須將伺服器名稱附加至連接字串中的 UserId。 例如 user@servername。 從 Microsoft JDBC Driver for SQL Server 4.0 版開始,您不再需要將 @servername 附加至連接字串中的 UserId。
使用加密需要設定 hostNameInCertificate
在 Microsoft JDBC Driver for SQL Server 7.2 版之前,連線到 Azure SQL Database 時,如果您指定了 encrypt=true (如果連接字串中的伺服器名稱為 shortName.domainName,請將 hostNameInCertificate 屬性設定為 *.domainName),則應該指定 hostNameInCertificate。 從驅動程式 7.2 版開始,這個屬性是選擇性的。
例如:
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;