轉載:有關SQL server connection Keep Alive 的FAQ(2)

stswordman發表於2013-08-20

 轉: http://blogs.msdn.com/b/apgcdsd/archive/2012/05/18/sql-server-connection-keep-alive-faq-2.aspx

 

 

在下面這篇文章裡面介紹了有關keepalive的一些FAQ:

http://blogs.msdn.com/b/apgcdsd/archive/2011/05/03/sql-server-connection-keepalive-faq.aspx

   

這篇文章再進一步討論有關Keep Alive的幾個問題.

   

1Keep Alive機制,是否只和特定的provider有關,比如SQL native client, odbc, oledb, ADO等等?

[]和連線使用的上層應用(ADO,SQL client, ODBC etc) 無關。和TCP協議和Named Pipe 有關。

   

2Blog上有一句提到"如果該連線空閒時間(沒有任何資料互動)超過keepalivetime",這裡面說的資料,是指網路包還是實實在在的資料庫裡面的資料?

[] 是網路層面上的package,但不包括keepalive

   

3、以上講的Keep Alive均指server端的,客戶端的Keep Alive能否設定,如何設定,如何知道客戶端設定了,如果客戶端設定了,以server的為準還是client的為準?

[]客戶端設定參考如圖。

   

紅色框框裡面的是針對客戶端程式使用native client的設定值。

伺服器端的Keep Alive 控制SQL server程式的Keep Alive值。客戶端的設定控制客戶端程式的Keep Alive值。他們相互不干擾。比方說,客戶端建立TCP 連線到SQL server,這個時候客戶端和伺服器的keep alive都會起作用。它們各自傳送自己程式的keepalive包。誰的keepalive值小誰就先發出keepalive 包。比如說,如果客戶端設定30秒,那麼客戶端在條件滿足時每隔30秒就會發一個keepalive,而伺服器的keepalive10秒,那麼伺服器會在條件滿足時每隔10秒發個keepalive包。客戶端TCP透過keepalive包監控connection情況,如果它發現connection有問題,就會關閉連線。伺服器端也一樣的。

   

4假設應用遠端連線至資料庫做update操作,一直不commit,在未返回前模擬資料庫端對應用網路卡disabled. 我在伺服器上設定伺服器的TCP keepalive15秒。這時候35~40秒我的程式收到報錯。為什麼不是我設定的15秒而是40秒? 

[]伺服器的Keep Alive只管SQL server程式自己的connections。伺服器網路卡突然被disable, 那麼作業系統會馬上獲知這個事件,那麼這個SQL server 也會馬上知道,所以不會等待15秒,而是馬上就會把相應connection斷開。而這個時候客戶端程式因為網路卡已經斷開,無法收到伺服器的關閉連線事件,那麼客戶端的keepalive會發出,偵測連線的情況。客戶端預設keepalive =30 秒,所以大概35~40秒客戶端程式才會檢查到連線錯誤。

如果是在客戶端disable網路卡,那麼客戶端的連線會馬上關閉,而伺服器端會過15秒才知道connection出問題。

   

5.在部落格中有句話:如果一個應用程式沒有顯式呼叫函式設定TCP連線的keepalive屬性,那麼他的TCP連線預設使用OS TCP配置。OS keep alive配置預設是關閉的。我確實在HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters找不到任何的keep alive值,而OSkeep alive配置預設是關閉的,關閉表示什麼意思?

[關閉就是disable,就是說沒有傳送keep alive包這樣的行為。那麼對於一個連線,只有在真正傳送資料的時候才能知道是否可用,而不能事先知道。keepalive包的偵測行為可以更快知道一個連線是否正常。 SQL server SQL native client等部件的keep alive預設都是開啟(enable)的。

   

   

相關文章