6

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

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

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

目前,我的连接字符串是

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

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

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

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

4

3 回答 3

2

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

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

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

于 2010-06-28T20:22:00.233 回答
2

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

于 2013-09-10T04:43:15.257 回答
1

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

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

于 2010-06-24T21:48:17.827 回答