欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

有关SQL server connection Keep Alive的FAQ

程序员文章站 2024-04-03 12:15:40
...

这个是SQL Server Keep Alive FAQ文章的最后一篇。 问题 1 :为什么我在客户端设置了 KeepAlive 值 , 但是我使用 SQL server management studio 测试的时候,该值总是不起作用? [答]目前市场上主流的数据库访问技术有ODBC,OLEDB,SQL native client 和 SQL

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

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

[答]目前市场上主流的访问技术有ODBC,OLEDB,SQL 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连接发给SQLcmd的keepalive包,每个包间隔30秒(时间间隔可以看time offset前后相减即可)。而上图间隔7秒的是SQLcmd的TCP连接发出的keepalive包。我测试中使用SQL server configuration manager设置了native client 的keepalive为7秒。从上面图也印证了服务器端的TCP连接和客户端的TCP连接各自发送自己的keepalive包,相互不影响。

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

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 managed的SQLclient,所以上面针对native client的设置对SQLclient无效。SQL server management studio 使用了 hard-coded的30秒值,无法修改。

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

[答]缺省值都是30秒。

可以修改如下注册表值来设置ODBC 和SQL OLEDB的keepalive值:

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

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

注意如果是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的应用程序里面使用代码设置。