4

我们的服务器有时会抛出这个众所周知的异常:

超时已过。在操作完成之前超时时间已过或服务器没有响应。

当服务器处理大请求时,这种情况会在压力下发生。我做了一些研究,发现我可以更改连接字符串连接超时设置和/或SqlCommand.Timeout数据读取器属性。

默认情况下,sql 命令超时设置为30秒,连接超时设置为15,我们从不覆盖它们。

我在管理工作室中复制了上下文并手动执行了失败的请求。它们的持续时间大约为 1秒,并且总是远远超过 30秒。

但奇怪的是,当我查看服务器日志时,请求调用会立即抛出此异常。我的意思是,请求正在执行,一毫秒后引发异常。对不起,让我看看这个8-o的怪胎。

完整地说,我们的 sql 实例以同步模式与另一个实例镜像。我们通过表格适配器使用 Ado.Net。

4

3 回答 3

4

事实上,即使设置了 READ_COMMITED_SNAPSHOT,我们仍然会遇到这些随机超时。

将镜像设置为异步模式没有帮助,在多个线程中完成的查询在大约 1 毫秒后仍然随机超时,总是在繁忙时段。另一方面,触发超时的特定查询(INSERT 语句)本身执行得非常快(CPU 不到 1 毫秒,平均读取约 10 次)。

调用堆栈如下:

在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)

在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)

在 System.Data.SqlClient.SqlConnection.Open()

所以超时似乎与查询本身无关。

根据另一篇文章:Multithreaded Windows Service 中的多个同时 SQL 连接超时和有关 ADO.NET 错误的链接MSDN 博客文章,我们尝试在连接字符串中将连接超时设置为150

不能确定我们是否遇到了这个错误,但自此更改以来没有再引发超时。

于 2011-11-24T11:19:22.950 回答
2

最后,经过数小时的跟踪和分析,问题在于两件事的相关性:

  1. 读取已提交的默认 Sql Server 隔离级别导致阻塞情况
  2. 一些非常糟糕的调优请求和存储过程与无索引表混合

第一个原因是固定的

ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON

第二个带有清晰的请求重写和表索引。

于 2011-05-06T14:51:15.290 回答
0

此时我将运行 SQL Profiler 并查看正在执行的查询。

于 2011-04-21T14:30:11.157 回答