有關(guān)SQL server connection Keep Alive的FAQ

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

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

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

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

也就是說(shuō), 該值只對(duì)使用SQL Native Client 來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的程序有效。SQLcmd.exe是使用SQL native client來(lái)訪問(wèn)SQL server的一個(gè)命令行工具,所以您可以使用SQLCmd來(lái)測(cè)試上面的keepalive值。注意修改keepalive值后,你需要退出SQLcmd重新運(yùn)行它才能使用新值。我在幾組機(jī)器測(cè)試了幾組不同的keepalive值,SQLcmd程序的TCP連接都很好按照設(shè)置的值發(fā)出keepalive網(wǎng)絡(luò)包。注意你需要使用TCP連接來(lái)測(cè)試。 我使用下面的連接串以保證使用TCP 連接:

SQLcmd -E -STCP:mycomputerSQL2012,55890

(機(jī)器名:mycomputer,實(shí)例名:SQL2012,端口號(hào) 55890)

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

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

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

HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientSNIx.0tcpProperty2

HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientSNIx.0tcpProperty3

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

問(wèn)題2. ODBCSQL OLEDBSQL native clientSQLClientTCP keepalive缺省時(shí)間都是多少?在哪里可以設(shè)置?

[答]缺省值都是30秒。

可以修改如下注冊(cè)表值來(lái)設(shè)置ODBC 和SQL OLEDB的keepalive值:

HKLMSOFTWAREMicrosoftMSSQLServerClientSuperSocketNetLibTcp ==> KeepAliveTime : DWORD :

HKLMSOFTWAREMicrosoftMSSQLServerClientSuperSocketNetLibTcp ==> KeepAliveInterval : DWORD :

注意如果是x64的機(jī)器,在上面運(yùn)行32位的ODBC/SQL OLEDB程序,則需要修改如下注冊(cè)表:

HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftMSSQLServerClientSuperSocketNetLibTCP

對(duì)于SQLserver native client 和SQL server 的keep alive設(shè)置,可以在SQL server configuration manager 修改,具體請(qǐng)參考請(qǐng)參考FAQ (1)和FAQ (2)或問(wèn)題1。

對(duì)于SQL client,需要在使用sqlclient的應(yīng)用程序里面使用代碼設(shè)置。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享