SqlException超时未到达而过期

我们的服务器不时抛出这个众所周知的例外情况:

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

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

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

我复制了背景并在管理工作室手动执行了令人失望的请求。 它们的持续时间大约为1秒,总是远远超过30秒。

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

为了完整,我们的sql实例在同步模式下与另一个镜像进行镜像。 我们通过表格适配器使用Ado.Net。


事实上,即使在READ_COMMITED_SNAPSHOT被设置之后,我们仍然经历了这些随机超时。

以异步模式设置镜像没有帮助,在多个线程中完成的查询在大约1ms后仍然随机超时,总是处于繁忙时段。 另一方面,触发超时的特定查询(INSERT语句)执行速度非常快(CPU时间小于1ms,平均读取大约10次)。

调用堆栈如下:

在System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection拥有对象)

在System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection拥有连接)

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

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

所以超时似乎与查询本身没有关系。

根据另一篇文章:多个同时SQL连接超时在多线程Windows服务和链接的MSDN博客文章中谈到ADO.NET错误,我们试图在连接字符串中将连接超时设置为150

无法确定我们是否遇到了此错误,但自此更改以来没有更多超时。


最终,经过几个小时的跟踪和分析,问题是两件事情的关联:

  • 读取提交的默认Sql Server隔离级别导致阻塞情况
  • 一些真正调优的请求和存储过程与无索引表混合在一起
  • 第一个原因被修复了

    ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON
    

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


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

    链接地址: http://www.djcxy.com/p/9705.html

    上一篇: SqlException timeout expired without being reached

    下一篇: How to use standard validation data annotations with custom types?