C# 尽管连接字符串超时3秒,Sql连接仍会等待15秒

C# 尽管连接字符串超时3秒,Sql连接仍会等待15秒,c#,sql-server-2008,connection-string,connection-timeout,C#,Sql Server 2008,Connection String,Connection Timeout,我有一个通过本地网络使用Microsoft SQL 2008 server的网站。有时,SQL server计算机会重新启动,因此网站无法连接到数据库。如果机器启动并运行,它将快速响应。如果关闭,则无需等待15秒。3秒钟就可以了 当数据库无法访问时,我想在网站上显示道歉信息,并希望尽快完成。但在连接字符串中设置连接超时=3似乎没有效果。页面花费22秒等待,然后在SqlConnection.Open()上抛出SqlException 怎么了?可能是覆盖超时的隐藏配置 目前,我的连接字符串是 Dat

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

当数据库无法访问时,我想在网站上显示道歉信息,并希望尽快完成。但在连接字符串中设置
连接超时=3
似乎没有效果。页面花费22秒等待,然后在
SqlConnection.Open()上抛出
SqlException

怎么了?可能是覆盖超时的隐藏配置

目前,我的连接字符串是

Data Source=...;
Initial Catalog=...;
Integrated Security=True;
Connection Timeout=3
如果我将其设置为
。。。;ConnectionTimeout=3
(无空格)


抛出(奇怪,表示我们可以同时使用两个字符串)。

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


不确定这是否有用,但当我在过去遇到这个问题时,这是因为我还需要设置
SqlCommand.CommandTimeout
。我遇到的情况是连接成功打开,然后DB服务器关闭,然后我的下一个命令没有按照连接超时的预期速度超时,这是由于还需要设置
命令超时。

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

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


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

以下博文帮助我解决了此问题:

注意:检查
SqlConnection.ConnectionTimeout的值时,会得到预期的“3”。因此连接字符串似乎是正确的。请尝试telnet检查超时是否特定于网络card@Sheng江蒋晟: 我到底要做什么?我试着联系,好像花了20秒。在“网络错误:连接超时”之前,因此网页在尝试连接到SQL server时花费的时间相同。这是什么意思?这有什么帮助?如果在调用Open()之前从连接字符串中删除超时并将属性设置为3,会有什么不同?听起来好像没有,但我想检查一下。另外,如果在创建新的SqlConnection之前创建SqlConnection.ClearAllPools,有什么区别吗?想知道它是否正在使用池连接,因此连接超时不会被使用,因为它已经连接。这可能意味着在网络驱动程序报告固件中设置的无法访问的目标之前有一个超时。
CommandTimeout
SqlCommand
的属性,因此它不会影响
SqlConnection.Open()
并且不能在此级别使用。此外,更改服务器上的命令超时(默认为600秒)也没有帮助,因为SQL server已关闭。
System.ArgumentException: Keyword not supported: 'connectiontimeout'.