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

这个是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)

    这个是SQL Server Keep Alive FAQ文章的最后一篇. 问题1:为什么我在客户端设置了KeepAlive值,但是我使用SQL server management studio 测试的 ...

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

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

  3. 【转载】SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  4. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE

    需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...

  5. 【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库

    提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------正 文 -- ...

  6. 【转载】SQL Server 2005关于数据类型最大值(3)

    原文地址:SQL Server 2005关于数据类型最大值(3) 调整SQL Server中text和image的默认值 exec sp_configure 'max text repl size ( ...

  7. 【转载】SQL Server性能调教系列(5)--SQL Server配置

    一:前言 在新安装SQL Server 2005/2008之后,我们需要根据Server软硬件设施对SQL Server做一些配置,以至能够发挥较好的性能.但是在大多数情况下还是采取默认的配置. 二: ...

  8. 【转载】SQL Server dateTime类型 模糊查询

    日期格式的like模糊查询真的好怪,在一个项目中,我试了很多种查法: select * from T where sendTime like '%2007_12_%'    可以查询2007年12月的 ...

  9. 【转载】SQL SERVER 游标

    转载来源: <http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html> 游标是邪恶的! 在关系数据库中,我们 ...

最新文章

  1. 介绍如何用 Python 来绘制高清的交互式地图,建议收藏
  2. Android Region代码分析
  3. SPC.NET,为5年的开发做个结尾
  4. iOS相册实现与AssetsLibrary框架使用
  5. Tomcat端口占用相关的问题
  6. HTML5video 标签
  7. MySQL集群搭建——主备模式
  8. 华为发布“吓人技术”GPU Turbo
  9. curlopt_ssl_verifypeer后https还是验证不过_为什么 HTTPS 需要 7 次握手和 9 倍时延
  10. 上海宝付教你如何更好地保护手机隐私
  11. 损失函数为什么用平方形式
  12. 大话谈VUE之export const
  13. Ubuntu Linux 8.04系统下智能拼音输入法
  14. 几何图形变化(Codevember)
  15. 预制菜开启春节之战,破局立新正在进行时
  16. shell 抓取页面信息 ip168查询 IP归属地
  17. 【深度学习】详解 CLIP
  18. 一文看懂Linux内核的整体架构
  19. GD32F30x系列系统及存储器架构
  20. 罗斯蒙特3051隔离膜片材料的选择

热门文章

  1. 大数据与数据挖掘考试题_大数据时代下的数据挖掘试题及答案
  2. (14)Why some people find exercise harder than others
  3. 如何用纯 CSS 创作一个单元素抛盒子的 loader
  4. 机器学习十大算法之EM算法
  5. 汇总下几个IP计算/转换的shell小脚本-转
  6. package和import语句_5
  7. __GLOBAL__I_a in libUPPayPlugin.a(UPPasswordTool.o)
  8. 浅谈ASP.NET 缓存技术
  9. IT市场10大技术伟人 Linux之父居首(转)
  10. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题