我们的服务器不时抛出这个众所周知的异常:
超时已过。操作完成前超时时间已过或服务器未响应。
当服务器处理大请求时,会在压力下发生这种情况。
我做了一些研究,发现我可以改变 连接字符串连接超时设置和/或 SqlCommand.超时数据读取器属性。
默认情况下,sql 命令超时设置为 30 秒和连接超时到 15 ,我们从不覆盖它们。
我在管理工作室中复制了上下文并手动执行了失败的请求。
它们的持续时间是 约 1 第二且永远 远远超过 30 .
但奇怪的是,当我查看服务器日志时,请求调用立即抛出此异常。
我的意思是,请求正在执行,一毫秒后引发异常。
对不起,让我看看这个 8 点 .
为了完整起见,我们的 sql 实例与 中的另一个实例进行了镜像。同步模式 .
我们通过表适配器使用 Ado.Net。
最佳答案
事实上,即使在设置了 READ_COMMITED_SNAPSHOT 之后,我们仍然会遇到这些随机超时。
在异步模式下设置镜像没有帮助,在多个线程中完成的查询在大约 1ms 后仍然随机超时,总是在繁忙时段。另一方面,触发超时的特定查询(INSERT 语句)本身执行得非常快(CPU 不到 1 毫秒,平均读取次数约为 10 次)。
调用堆栈如下:
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
所以超时似乎与查询本身无关。
根据另一个帖子:Multiple Simultaneous SQL Connection Timeouts In Multithreaded Windows Service和链接 MSDN blog post谈到 ADO.NET 错误,我们尝试将连接超时设置为 150 在连接字符串中。
无法确定我们是否遇到了此错误,但自此更改后不再引发超时。
关于sql-server - SqlException 超时已过期但未达到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5744904/