转载:有关SQL server connection Keep Alive 的FAQ(2)

时间:2024-03-21 18:03:32

转: 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的几个问题.

、Keep Alive机制,是否只和特定的provider有关,比如SQL native client, odbc, oledb, ADO等等?

[答]和连接使用的上层应用(ADO,SQL client, ODBC etc) 无关。和TCP协议和Named Pipe 有关。

、Blog上有一句提到"如果该连接空闲时间(没有任何数据交互)超过keepalivetime",这里面说的数据,是指网络包还是实实在在的数据库里面的数据?

[答] 是网络层面上的package,但不包括keepalive包。

、以上讲的Keep Alive均指server端的,客户端的Keep Alive能否设置,如何设置,如何知道客户端设置了,如果客户端设置了,以server的为准还是client的为准?

[答]客户端设置参考如图。

转载:有关SQL server connection Keep Alive 的FAQ(2)

红色框框里面的是针对客户端程序使用native client的设置值。

秒,那么客户端在条件满足时每隔30秒就会发一个keepalive,而服务器的keepalive是10秒,那么服务器会在条件满足时每隔10秒发个keepalive包。客户端TCP通过keepalive包监控connection情况,如果它发现connection有问题,就会关闭连接。服务器端也一样的。

.假设应用远程连接至数据库做update操作,一直不commit,在未返回前模拟数据库端对应用网卡disabled. 我在服务器上设置服务器的TCP keepalive为15秒。这时候35~40秒我的程序收到报错。为什么不是我设置的15秒而是40秒?

秒,而是马上就会把相应connection断开。而这个时候客户端程序因为网卡已经断开,无法收到服务器的关闭连接事件,那么客户端的keepalive会发出,侦测连接的情况。客户端缺省keepalive =30 秒,所以大概35~40秒客户端程序才会检查到连接错误。

秒才知道connection出问题。

.在博客中有句话:如果一个应用程序没有显式调用函数设置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)的。