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 。
无法确定我们是否遇到了此错误,但自此更改以来没有更多超时。
最终,经过几个小时的跟踪和分析,问题是两件事情的关联:
第一个原因被修复了
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?