这个是SQL Server Keep Alive FAQ文章的最后一篇。

问题1:为什么我在客户端设置了KeepAlive,但是我使用SQL server management studio 测试的时候,该值总是不起作用?

[]目前市场上主流的数据库访问技术有ODBCOLEDBSQL native client SQLclient。其中SQLclient.NET里面使用的托管provider。目前SQL Server configuration manager里面提供的keepalive设置是针对SQL native client 的:

也就是说, 该值只对使用SQL Native Client 来访问数据库的程序有效。SQLcmd.exe是使用SQL native client来访问SQL server的一个命令行工具,所以您可以使用SQLCmd来测试上面的keepalive值。注意修改keepalive值后,你需要退出SQLcmd重新运行它才能使用新值。我在几组机器测试了几组不同的keepalive值,SQLcmd程序的TCP连接都很好按照设置的值发出keepalive网络包。注意你需要使用TCP连接服务器来测试。 我使用下面的连接串以保证使用TCP 连接:

SQLcmd -E -STCP:mycomputer\SQL2012,55890

(机器名:mycomputer,实例名:SQL2012,端口号 55890)

我使用network monitor 3.4捕获keepalive包如下图:

上图中深蓝高亮的是我挑出的由服务器TCP连接发给SQLcmdkeepalive包,每个包间隔30秒(时间间隔可以看time offset前后相减即可)。而上图间隔7秒的是SQLcmdTCP连接发出的keepalive包。我测试中使用SQL server configuration manager设置了native client keepalive7秒。从上面图也印证了服务器端的TCP连接和客户端的TCP连接各自发送自己的keepalive包,相互不影响。

注意, SQL Server native clientkeepalive值存放在下面注册表里面:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNIx.0\tcp\Property2

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNIx.0\tcp\Property3

那么SQL server management studio ssms.exe)是使用.NET managedSQLclient,所以上面针对native client的设置对SQLclient无效。SQL server management studio  使用了 hard-coded30秒值,无法修改。

问题2. ODBCSQL OLEDBSQL native clientSQLClientTCP keepalive缺省时间都是多少?在哪里可以设置?

[]缺省值都是30秒。

可以修改如下注册表值来设置ODBC SQL OLEDBkeepalive值:

HKLM\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib\Tcp ==> KeepAliveTime : DWORD : <dwValue>

HKLM\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib\Tcp ==> KeepAliveInterval : DWORD : <dwValue>

注意如果是x64的机器,在上面运行32位的ODBC/SQL OLEDB程序,则需要修改如下注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Client\SuperSocketNetLib\TCP

对于SQLserver native client SQL server keep alive设置,可以在SQL server configuration manager 修改,具体请参考请参考FAQ 1)和FAQ 2)或问题1

对于SQL client,需要在使用sqlclient的应用程序里面使用代码设置。

问题3:服务器端如果网线被拔掉,这对于那些已经存在的TCP连接会有什么影响?SQL server会马上关闭连接么?如果拔掉网线然后马上又插回去呢?

[]这样问题复杂一些。当网线拔掉的时候,网卡首先获知该事件。Windows 2003以及后面的操作系统都实现了media sense 媒体感知功能。操作系统收到网卡发来的media sense 的断线(disconnect)事件后,如果在DisconnectDampInterval(一般是5-10秒)的时间内,网线连接还没有恢复,那么就会发送信息给侦听该网卡IP的连接。那么所有监听该IP的上层应用程序如SQL server 就会得到disconnect的事件,然后就会进行相应的动作如kill connection rollback事务等。

具体点来说,SQL server 的网络IO是通过IOCP IOCompletionPort)实现的。 SQL server在后台有几个专门的线程侦听该端口。这些线程调用GetQueuedCompletionStatus()函数得到网络数据状态,然后调用相应的callback函数(如ReadHandler函数)来做具体的数据处理。当网线断的时候,操作系统过了DisconnectDampInterval时间后,GetQueuedCompletionStatus函数就会得到disconnect信息,而callback函数readhandler就被调用来读取数据但实际上是读到disconnect的网络断事件。SQL server 得知该disconnect事件后,就生成一个task,该task就是做kill session的任务,把事务会滚,把连接(connection)关掉。

所以说,如果你在很快的时间内(几秒),拔掉网线马上插回来,那么SQL serverTCP连接(connection)会保持不会被关闭。

你或许会问,media sense功能如何disable呢?具体可以参考如下命令:

netsh interface ipv4 set global dhcpmediasense=disabled

netsh interface ipv6 set global dhcpmediasense=disabled

如何察看这些设置的命令如下:

netsh interface ipv4 show global

netsh interface ipv6 show global

回到keepalive 如果SQL Server服务器的TCPkeepalive设置时间很短,小于DisconnectDampInterval -5时间值,那么SQL server会先于操作系统得知连接断线的状态而采取相应的动作。实际中不建议过短的keepalive值。

问题4DisconnectDampInterval在哪里可以修改?有没有media sense的更多的信息?

[]可以参考如下WinCE的文档:在

http://msdn.microsoft.com/en-US/library/ee486075(v=WinEmbedded.60).aspx

ConnectDampingInterval specifies the amount of time, in seconds, by which TCP/IP will delay any action in response to a Media Sense connect event.

DisconnectDampInterval specifies the amount of time, in seconds, by which TCP/IP will delay any action in response to a Media Sense disconnect event.

在非CE平台上该定义依然有效,不过,缺省值是5~10秒。可以修改如下注册表修改该值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters

DisconnectDampInterval

ConnectDampInterval

这两个参数有最大最小值限制, Min = 5 seconds,Max = 10 seconds

问题5:如下图SQL server的网络协议TCP的属性页为何没有keep alive interval选项?

[]SQL server的网络协议TCPkeep alive interval是不能修改的,注册表也无法修改. SQL server源代码里面写定了1秒的时间间隔.

问题6:我的应用程序如何才能捕获keepalive机制侦测到的网络问题?

[] 对于用户程序,你需要调用ExecuteSQL或类似的方法才能获知connection的真实状态. 如下面例子所示:

using (SqlConnection connection = new SqlConnection())

{

connection.ConnectionString ="Data Source=TCP:cn-simon-w7\\sql2012,55890;Initial Catalog=test;Integrated Security=true;pooling=false";

SqlCommand cmd = new SqlCommand();

cmd.CommandText = "select * from t";

cmd.Connection = connection;

cmd.CommandTimeout = 0;

try

{

connection.Open();

cmd.ExecuteNonQuery();

}

catch (Exception ex)

{

//do your work here for this exception

MessageBox.Show(ex.Message);

};

}

我做了小测试步骤如下:

1) 想办法阻塞 “select * from t”使得它不返回结果而处于等待状态。

2) 然后拔掉服务器网络线。

3) 然后过一会,我的catch语句捕获了错误

你其实可以对ex对象做更多的处理,请参看有关编程文档,此处不多描述。

有关SQL server connection Keep Alive 的FAQ(3)相关推荐

  1. 转载:有关SQL server connection Keep Alive 的FAQ(3)

    转载:http://blogs.msdn.com/b/apgcdsd/archive/2012/06/07/sql-server-connection-keep-alive-faq-3.aspx 这个 ...

  2. 有关SQL server connection Keep Alive 的FAQ(2)

    这篇文章再进一步讨论有关Keep Alive的几个问题. 1.Keep Alive机制,是否只和特定的provider有关,比如SQL native client, odbc, oledb, ADO等 ...

  3. SQL Server 2005 Sa 用户的启用

    http://blog.csdn.net/dream_like/article/details/2859786 SQL Server 2005 Sa 用户的启用 SQL Server 2005 默认安 ...

  4. 连接SQL Server文件集锦

    在新建SqlConnection对象,连接资料库时连接失败,出现"常规网络错误.请检查您的网络文档." DataSource直接写IP的话,通信协议是按照TCP/IP协议连接的,如 ...

  5. 今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个...

    今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个 Failover Partner的选项.以前都没注意过,它的主要功能就是 ...

  6. SQL Server便利名称

    介绍 (Introduction) A while ago I discovered that you can conveniently connect to a local instance of ...

  7. 如何创建SQL Server报告服务(SSRS)报告

    SQL Server Reporting Services (SSRS) is part of Microsoft SQL Server services since version 2000. If ...

  8. sql server 性能_如何在SQL Server中收集性能和系统信息

    sql server 性能 介绍 (Introduction) In this article, we're going through many of the tools we can use fo ...

  9. 如何使用PSDatabaseClone设置基于图像SQL Server数据库配置

    This article will provide information about requirements and step-by-step instructions on how to set ...

最新文章

  1. WPF编游戏系列 之四 用户控件
  2. 类CL_ABAP_TYPEDESCR,动态取得运行时类型
  3. 神奇的机器人评课_《聪明的机器人》教学反思
  4. 关于Infobright的一个小TIPS
  5. DjangoORM框架
  6. java数组 —(8)
  7. java httpclient 关闭_【Java系列007】HttpClient调用:你考虑过关闭连接、并发了吗?...
  8. 我们分析了50万条拼多多商品数据,告诉你到底是消费升级还是降级?
  9. Android修图处理算法—— drawBitmapMesh算法实现瘦脸效果
  10. Python学习笔记--Python字符串连接方法总结
  11. 校园网打开IEEE 显示未登录
  12. 8086汇编实现 加密解密软件
  13. 游戏音效制作的基本步骤
  14. 计算机平面设计大专学校排名,平面设计学校排名哪些较好?
  15. SNF快速开发平台--多组织+多平台+多系统处理方案
  16. 如何选择适合你的兴趣爱好(二十八),小提琴
  17. 经典图书介绍:广义相对论--1972讲稿
  18. ci框架 反向代理配置_docker-compose配置Nginx反向代理禅道
  19. 大华流媒体服务器型号列表,大华DAHUA网络视频存储服务器DH-EVS5016S详细信息_产品参数_价格_联系方式_DAV数字音视工程网...
  20. Huawei 5G MiFi E6878-370 VS E6878-870

热门文章

  1. 如何把一个二维数组的地址赋给一个二维指针?
  2. 《EMCAScript6入门》读书笔记——24.编程风格
  3. 【转】Android编码规范建议18条
  4. navigation
  5. css sprite技巧详解
  6. 《Python核心编程》第二版第36页第二章练习 续一 -Python核心编程答案-自己做的-...
  7. C#反射实例No.1
  8. ProGit-读书简记
  9. Java B2B2C o2o多用户商城 springcloud架构 (六)分布式配置中心(Spring Cloud Config)
  10. 10.17 配置IP,网络问题排查