尽管连接字符串中有3秒超时,但Sql连接等待15秒

时间:2010-06-24 21:35:54

标签: c# sql-server-2008 connection-string connection-timeout

我有一个通过本地网络使用Microsoft SQL 2008服务器的网站。有时,SQL服务器计算机重新启动,因此网站无法连接到数据库。如果计算机已启动并正在运行,则快速响应。如果它关闭,则无需等待15秒。 3秒钟就可以了。

我想在数据库无法访问时在网站上显示道歉,并希望快速完成。但是在连接字符串中设置Connection Timeout=3似乎没有任何效果。在SqlException投放SqlConnection.Open();之前,该页面需要等待22秒。

它出了什么问题?可能是隐藏配置会覆盖超时吗?

目前,我的连接字符串是

Data Source=...;
Initial Catalog=...;
Integrated Security=True;
Connection Timeout=3

如果我将其设置为...;ConnectionTimeout=3(没有空格),

System.ArgumentException: Keyword not supported: 'connectiontimeout'.
抛出

(奇怪的是,MSDN documentation表示我们可以使用这两个字符串。)

3 个答案:

答案 0 :(得分:2)

网络硬件报告网络驱动程序的连接超时之前有一个超时,而网络驱动程序又会通知等待网络IO的程序。您可以通过telnet servername 1433验证传输层超时(假设您的sql服务器正在侦听端口1433)。

但是3秒对于初始化网络API的过程来说太短了(假设您的Web应用程序在自己的应用程序池中),发送请求并等待硬件超时。更新BIOS /固件/驱动程序可能不会减少响应时间。

最好以异步方式执行连接。我不建议使用EndInvoke来结束异步调用,因为不幸的用户可能仍需要等待3整秒才能看到数据库关闭时的任何响应。也许Ajax调用更好。如果您有很多用户经常访问您的网站,您可能希望缓存连接检查的结果并以对用户有意义的方式更新它。

答案 1 :(得分:1)

没有空格的

ConnectionTimeout是通过代码访问时的属性名称,而不是连接字符串。

不确定这是否有用,但是当我过去遇到这个问题时,那是因为我还需要设置SqlCommand.CommandTimeout。对我来说发生的事情是连接成功打开,然后数据库服务器关闭,然后我的下一个命令没有像我预期的那样根据连接超时而超时,这是由于CommandTimeout需要设置同样。

答案 2 :(得分:1)

以下博文帮助我解决了这个问题: http://improve.dk/controlling-sqlconnection-timeouts/