有關SQL server connection Keep Alive的FAQ

這個是sql server keep alive faq文章的最后一篇。 問題 1 :為什么我在客戶端設置了 KeepAlive 值 , 但是我使用 SQL server management studio 測試的時候,該值總是不起作用? [答]目前市場上主流的數據庫訪問技術有ODBC,OLEDB,SQL native client 和 SQL

這個是sql server keep alive faq文章的最后一篇。

問題1:為什么我在客戶端設置了KeepAlive,但是我使用SQL server management studio 測試的時候,該值總是不起作用?

[答]目前市場上主流的訪問技術有ODBC,OLEDB,SQL native client 和 SQLclient。其中SQLclient是.NET里面使用的托管provider。目前SQL Server configuration manager里面提供的keepalive設置是針對SQL native client 的:

也就是說, 該值只對使用SQL Native Client 來訪問數據庫的程序有效。SQLcmd.exe是使用SQL native client來訪問SQL server的一個命令行工具,所以您可以使用SQLCmd來測試上面的keepalive值。注意修改keepalive值后,你需要退出SQLcmd重新運行它才能使用新值。我在幾組機器測試了幾組不同的keepalive值,SQLcmd程序的TCP連接都很好按照設置的值發出keepalive網絡包。注意你需要使用TCP連接來測試。 我使用下面的連接串以保證使用TCP 連接:

SQLcmd -E -STCP:mycomputerSQL2012,55890

(機器名:mycomputer,實例名:SQL2012,端口號 55890)

我使用network monitor 3.4捕獲keepalive包如下圖:

上圖中深藍高亮的是我挑出的由服務器TCP連接發給SQLcmd的keepalive包,每個包間隔30秒(時間間隔可以看time offset前后相減即可)。而上圖間隔7秒的是SQLcmd的TCP連接發出的keepalive包。我測試中使用SQL server configuration manager設置了native client 的keepalive為7秒。從上面圖也印證了服務器端的TCP連接和客戶端的TCP連接各自發送自己的keepalive包,相互不影響。

注意, SQL Server native client的keepalive值存放在下面注冊表里面:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientSNIx.0tcpProperty2

HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientSNIx.0tcpProperty3

那么SQL server management studio (ssms.exe)是使用.NET managed的SQLclient,所以上面針對native client的設置對SQLclient無效。SQL server management studio? 使用了 hard-coded的30秒值,無法修改。

問題2. ODBCSQL OLEDBSQL native clientSQLClientTCP keepalive缺省時間都是多少?在哪里可以設置?

[答]缺省值都是30秒。

可以修改如下注冊表值來設置ODBC 和SQL OLEDB的keepalive值:

HKLMSOFTWAREMicrosoftMSSQLServerClientSuperSocketNetLibTcp ==> KeepAliveTime : DWORD :

HKLMSOFTWAREMicrosoftMSSQLServerClientSuperSocketNetLibTcp ==> KeepAliveInterval : DWORD :

注意如果是x64的機器,在上面運行32位的ODBC/SQL OLEDB程序,則需要修改如下注冊表:

HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftMSSQLServerClientSuperSocketNetLibTCP

對于SQLserver native client 和SQL server 的keep alive設置,可以在SQL server configuration manager 修改,具體請參考請參考FAQ (1)和FAQ (2)或問題1。

對于SQL client,需要在使用sqlclient的應用程序里面使用代碼設置。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享