有关SQL server connection Keep Alive 的FAQ(2)
在下面这篇文章里面介绍了有关keepalive的一些FAQ:
https://blogs.msdn.com/b/apgcdsd/archive/2011/05/03/sql-server-connection-keepalive-faq.aspx
这篇文章再进一步讨论有关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)的。
By 微软亚太区全球技术支持中心 数据库技术支持组
对话微软原厂技术专家,手把手教会你 SQL Server性能调优: https://support.microsoft.com/gp/anxin_training2/zh-cn
给SQL Server来个全套体检,有病治病,无病强身:https://support.microsoft.com/gp/anxin_guide6/zh-cn
SQL Server技术支持大全,根治纠结您N久的疑难杂症:https://support.microsoft.com/gp/anxin_sql/zh-cn