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

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

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

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

目前,我的连接字符串是

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

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

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

被抛出(奇怪的是, MSDN文档表明我们可以使用这两个字符串)。

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

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

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

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

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

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