转:http://blogs.msdn.com/b/apgcdsd/archive/2011/05/03/sql-server-connection-keepalive-faq.aspx

1、什么是SQL server TCP连接的keep Alive?

简单说,keep alive 是SQL server在建立每一个TCP 连接的时候,指定了TCP 协议的keepaliveinterval 和keepalivetime参数。这样对每个TCP连接,如果该连接空闲时间(没有任何数据交互)超过keepalivetime,TCP协议会自动发出keepalive 包检测连接存活与否。如果keepalive 检测次数超过注册表TcpMaxDataRetransmissions定义的值而对方还是没有回应,那么TCP就认为该连接有问题而关闭它。通过这样的机制SQL server能够检测出orphaned connection等问题。

SQL  server 对每个TCP连接缺省指定keep alive 为30秒,keepaliveinterval为1秒。Windows TCP配置的TcpMaxDataRetransmissions缺省是5次。就是说,如果TCP连接idle了30秒,那么TCP会发送第一个keepalive检查。如果失败,那么TCP会每隔1秒重发keepalive 包,直到重发5次。如果第五次检测依然失败,则该连接就被close。所以,一个TCP连接如果出现异常问题,大概在35秒的时候就会被close。

2、在那里可以配置SQL server 的keep alive 配置?

SQL server 2000代码里面也有对TCP连接指定keep alive属性,但没有提供用户界面给用户定制修改。SQL server2005使用configuration manager可以修改keep alive值,但是不能修改keepalive interval。 Keepaliveinterval是hardcoded的1秒。

Configuration manager的界面如下:

该值保存在注册表如下位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.?\MSSQLServer\SuperSocketNetLib\Tcp

注意SQL server的Native client也有类似配置,不要和server side 的TCP配置搞混了:

Native client的 keep alive 配置保存在如下位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp

3、SQL server的keepalive 和Windows的TCP协议里面的keepalive 是一样的吗?

原理一样,但不相互干扰。

Windows 的TCP协议也有keep alive 配置,位置如下:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

OS的TCP协议的keep alive 和SQL server 的keep alive 工作原理一样的,就是在建立TCP连接的时候指定TCP连接的keepalive属性(参见后面描述)。但是SQL server读取自己注册表的keep alive来设置TCP连接属性,不理会windows OS的注册表里面的keepalivetime和keepaliveinterval的值。

如果一个应用程序没有显式调用函数设置TCP连接的keepalive属性,那么他的TCP连接默认使用OS 的TCP配置。OSkeep alive配置默认是关闭的。

有关OS 的TCP配置参考如下文档:

http://support.microsoft.com/kb/314053 

KeepAliveInterval

Key: Tcpip\Parameters

Value Type: REG_DWORD - Time in milliseconds

Valid Range: 1 - 0xFFFFFFFF

Default: 1000 (one second)

Description: This parameter determines the interval that separates keepalive retransmissions until a response is received. After a response is received, KeepAliveTime again controls the delay until the next keepalive transmission. The connection is aborted after the number of retransmissions that are specified by TcpMaxDataRetransmissions are unanswered.

KeepAliveTime

Key: Tcpip\Parameters

Value Type: REG_DWORD - Time in milliseconds

Valid Range: 1 - 0xFFFFFFFF

Default: 7,200,000 (two hours)

Description: The parameter controls how frequently TCP tries to verify that an idle connection is still intact by sending a keepalive packet. If the remote computer is still reachable and functioning, the remote computer acknowledges the keepalive transmission. By default, keepalive packets are not sent. A program can turn on this feature on a connection

4、SQL server 和OS里面 的TCP的keep alive是如何实现的?

详见如下文档:

http://msdn.microsoft.com/en-us/library/ms741621.aspx 

SQL server也是调用如下API,把keepalive参数(lpvInBuffer)pass给这个API:

int WSAIoctl(

__in   SOCKET s,

__in   DWORD dwIoControlCode,

__in   LPVOID lpvInBuffer,

__in   DWORD cbInBuffer,

__out  LPVOID lpvOutBuffer,

__in   DWORD cbOutBuffer,

__out  LPDWORD lpcbBytesReturned,

__in   LPWSAOVERLAPPED lpOverlapped,

__in   LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

该文章里面有如下描述:

SIO_KEEPALIVE_VALS (opcode setting: I, T==3)

Enables or disables the per-connection setting of the TCP keep-alive option which specifies the TCP keep-alive timeout and interval. For more information on the keep-alive option, see section 4.2.3.6 on the Requirements for Internet Hosts—Communication Layers specified in RFC 1122 available at the IETF website. The argument structure for SIO_KEEPALIVE_VALS is specified in the tcp_keepalive structure defined in the Mstcpip.h header file. This structure is defined as follows:

Copy Code

/* Argument structure for SIO_KEEPALIVE_VALS */

struct tcp_keepalive {

u_long  onoff;

u_long  keepalivetime;

u_long  keepaliveinterval;

};

5、Named Pipe也有keepalive设置 吗?

有。

参见如下文档:

http://support.microsoft.com/?id=137983

Named Pipes: Named Pipes are implemented in Server Message Block (SMB) layer on top of other transport protocols such as TCP/IP, NetBEUI, or NWLink IPX/SPX. A thin layer called NetBIOS is typically implemented between the SMB and the transport layer. Therefore, a convenient way of adjusting how long a non-responsive Named Pipes session has to wait before being closed is through adjusting the KeepAlive parameters of the relevant NetBIOS layer. For TCP/IP, the NetBIOS layer involved is NBT (NetBIOS over TCP), and the parameter involved is SessionKeepAlive in the following registry key:

KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netbt\Parameters

6. 如何看SQL server 的连接?SQL server 会主动关闭连接吗?如何看连接的idle时间?

SQL 2005查询dm_exec_connections即可:

select session_id from sys.dm_exec_connections

Screen clipping taken: 20/08/2013 15:09

比较输出里面的last reads/writes 和现在时间可以大概知道一个连接的idle时间。

SQL server 2000则需要查询sysprocesses表。Last_batch时间代表最近一次执行batch的时间。

SQL server 不会关闭一个正常的TCP连接。除非底层TCP报告错误。或者连接或接收数据出错。

7、相关参考文档

SQL server TCP的keep alive

http://blogs.msdn.com/sql_protocols/archive/2006/03/09/546852.aspx

DBNetLib sets hard-coded KeepAliveTime and KeepAliveInterval

http://support.microsoft.com/kb/816649

TCP Keep-Alive Messages

http://msdn.microsoft.com/en-us/library/ms819735.aspx

转载:有关SQL server connection KeepAlive 的FAQ的更多相关文章

  1. 【转载】SQL server connection KeepAlive

    1.什么是SQL server TCP连接的keep Alive? 简单说,keep alive 是SQL server在建立每一个TCP 连接的时候,指定了TCP 协议的keepaliveinter ...

  2. SQL server connection KeepAlive[转]

    1.什么是SQL server TCP连接的keep Alive? 简单说,keep alive 是SQL server在建立每一个TCP 连接的时候,指定了TCP 协议的keepaliveinter ...

  3. WPF数据库连接错误:The user is not associated with a trusted SQL Server connection.

    我当初安装sql server的时候选的Window Authentication mode,没选SQL Server Windows Authentication. 后来做WPF时连接数据库时需要一 ...

  4. SQL Server Connection Pooling (ADO.NET)

    SQL Server Connection Pooling (ADO.NET) Connecting to a database server typically consists of severa ...

  5. [转】[tip] localhost vs. (local) in SQL Server connection strings

    主要区别在于连接协议不同,前者(localhost)使用TCP协议,后者("(local)")使用NamedPipe协议. Sample code with SQL Server ...

  6. 转载:有关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 这个 ...

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

    转: http://blogs.msdn.com/b/apgcdsd/archive/2012/05/18/sql-server-connection-keep-alive-faq-2.aspx 在下 ...

  8. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  9. 【转载】Sql Server参数化查询之where in和like实现详解

    文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where ...

随机推荐

  1. 2015年第7本(英文第6本):纳尼亚传奇I–狮子、女巫、魔衣橱

    书名: The Chronicles of Narnia 1 — The Lion, the Witch and the Wardrobe 作者:C.S. Lewis 单词数:4.2万 不重复单词数: ...

  2. R语言学习笔记:向量

    向量是R语言最基本的数据类型. 单个数值(标量)其实没有单独的数据类型,它只不过是只有一个元素的向量. x <- c(1, 2, 4, 9) x <- c(x[1:3], 88, x[4] ...

  3. IOS 杂笔-13(appearance的巧妙使用)

    在我们查看原生api时,我们不难发现,有些api的后面有着->UI_APPEARANCE_SELECTOR 那么我可以很高兴的说我们可以通过appearance对象来统一设置.十分巧妙. 例如: ...

  4. UIButton 内部介绍

    **     设置内容距btn边框距离     **/    btn.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);        /** 将lab ...

  5. 【文章内容来自《Android 应用程序开发权威指南》(第四版)】如何设计兼容的用户界面的一些建议(有删改)

    最近一直在看的一本书是<Android 应用程序开发权威指南>(第四版),十分推荐.书中讲到了一些用户界面设计的规范,对于初学者我认为十分有必要,在这里码给大家,希望对我们都有用. 在我们 ...

  6. Swift55个协议的分类和讲解分析

    首先我只想问:为什么是协议?为什么面向协议编程?如果我们回到过去那段年少无知少不更事的面相对象编程时期,我们很多人最初学习的是Objective-C,这意味着我们免受多继承的专横.又或者你是这个房间里 ...

  7. iOS多线程-02-GCD

    简介 GCD(Grand Center Dispatch)是Apple为多核的并行运算提出的解决方案,纯C语言 更加适配多核处理器,且自动管理线程的生命周期,使用起来较为方便 GCD通过任务和队列实现 ...

  8. IOS之UI--自定义按钮实现代理监听点击事件

    前言: Objective-C提供的按钮监听事件的方法是 不含参数的监听方法 [button实例对象 addTarget:self action:@selector(func) forControlE ...

  9. 建立JDBC的环境配置和相关下载(Mac)

    首先已经安装好XMAPP和Workbench. 1.打开MySQL,然后打开Workbench: 然后我们需要下载MySQL的JDBC驱动. 1.进入MySQL官网:http://dev.mysql. ...

  10. Nginx安装学习使用详细记录

    选择Nginx的优点:Nginx 可以在大多数 Unix like OS 上编译运行,并有 Windows 移植版. Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建 ...