我们的服务器不时抛出这个众所周知的异常:
超时已过期。操作完成之前经过的超时时间或服务器没有响应。
当服务器处理大请求时,这会在压力下发生。 我做了一些研究,发现我可以更改连接字符串连接超时设置和/或 SqlCommand.Timeout 数据阅读器属性。
默认情况下,sql命令超时设置为 30 秒,连接超时设置为 15 ,我们永远不会覆盖它们。
我复制了背景并在管理工作室手工执行了令人烦恼的要求。 它们的持续时间大约1 秒,并且远远超过30 。
但奇怪的是,当我查看服务器日志时,会立即抛出此异常请求调用。 我的意思是,请求正在执行,一毫秒后引发异常。 对不起,让我看看这个 8-o 。
要完成,我们的sql实例将在同步模式中与另一个实例进行镜像。 我们通过表适配器使用Ado.Net。
答案 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)
最后,经过数小时的跟踪和分析,问题在于两件事的相关性:
第一个原因是用
修复的ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON
第二个有清醒请求重写和表索引。
答案 2 :(得分:0)
此时我会运行SQL事件探查器,看看正在执行哪些查询。