有关SQL server connection Keep Alive 的FAQ(2)
這篇文章再進一步討論有關Keep Alive的幾個問題.
?
?
1、Keep Alive機制,是否只和特定的provider有關,比如SQL native client, odbc, oledb, ADO等等?
?
[答]和連接使用的上層應用(ADO,SQL client, ODBC etc) 無關。和TCP協議和Named Pipe 有關。
?
2、Blog上有一句提到“如果該連接空閑時間(沒有任何數據交互)超過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,而服務器的keepalive是10秒,那么服務器會在條件滿足時每隔10秒發個keepalive包。 客戶端TCP通過keepalive包監控connection情況,如果它發現connection有問題,就會關閉連接。服務器端也一樣的。
?
4. 假設應用遠程連接至數據庫做update操作,一直不commit,在未返回前模擬數據庫端對應用網卡disabled. 我在服務器上設置服務器的TCP keepalive為15秒。這時候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)的。
?
轉載于:https://www.cnblogs.com/blosaa/archive/2012/06/15/2550144.html
總結
以上是生活随笔為你收集整理的有关SQL server connection Keep Alive 的FAQ(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驱动列举进程输出到应用层
- 下一篇: 物联网、云计算商用或从“家庭自动化”得以