SqlException超时已到期但未到达

时间:2011-04-21 13:41:42

标签: sql-server ado.net timeout mirroring

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

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

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

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

我复制了背景并在管理工作室手工执行了令人烦恼的要求。 它们的持续时间大约1 秒,并且远远超过30

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

要完成,我们的sql实例将在同步模式中与另一个实例进行镜像。 我们通过表适配器使用Ado.Net。

3 个答案:

答案 0 :(得分:3)

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

在异步模式下设置镜像没有帮助,在多个线程中完成的查询在大约1ms之后仍然随机计时,总是在繁忙时段。另一方面,触发超时的特定查询(INSERT语句)执行速度非常快(CPU少于1ms,平均大约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()

因此,超时似乎与查询本身无关。

根据另一篇帖子:Multiple Simultaneous SQL Connection Timeouts In Multithreaded Windows Service和关于ADO.NET错误的链接MSDN blog post,我们尝试在连接字符串中将连接超时设置为 150

无法确定我们遇到了这个错误,但是自从此更改后没有更多的超时。

答案 1 :(得分:1)

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

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

    修复的
    ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON
    

    第二个有清醒请求重写和表索引。

答案 2 :(得分:0)

此时我会运行SQL事件探查器,看看正在执行哪些查询。