【问题标题】:Win32Exception (0x80004005): The wait operation timed outWin32Exception (0x80004005): 等待操作超时
【发布时间】:2013-04-28 00:28:30
【问题描述】:

我正在运行一个 ASP.NET 网页页面,该页面在初始加载时会从 SQL 服务器中提取项目列表。此查询在一秒钟左右运行并在 2 秒内加载页面。回报是大约 1000 条记录,给予或接受。我正在从 Service Manager SQL 数据库中提取主机名以及其他一些信息。

在此页面中,我内置了一个搜索,它基本上运行完全相同的查询,但使用基于主机名的 LIKE 运行它。这将加载包含搜索查询一部分的所有主机名的同一页面。查询通常在一秒钟内在 SQL Management Studio 中运行,但加载页面需要更长的时间,有时会超时。

我的问题是,为什么基于参数的搜索需要更长的时间,并且有时会无缘无故地超时。是否可以采取任何措施来缓解此超时?以下是完整的错误。

“/”应用程序中的服务器错误。


The wait operation timed out 

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情:

System.ComponentModel.Win32Exception: The wait operation timed out
Source Error: 

Line 13:     }
Line 14:     
Line 15:     var selectedData = db.Query(selectCommand, searchTerm);
Line 16: 
Line 17:

Source File:  c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml    Line:  15

堆栈跟踪:

[Win32Exception (0x80004005): The wait operation timed out]
[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1753346
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5295154
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1682
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +59
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1325
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.ExecuteReader() +12
   WebMatrix.Data.<QueryInternal>d__0.MoveNext() +152
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
   WebMatrix.Data.Database.Query(String commandText, Object[] parameters) +103
   ASP._Page_servers_default_cshtml.Execute() in c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml:15
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
   System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) +69
   System.Web.WebPages.WebPage.ExecutePageHierarchy() +151
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
   System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +114

版本信息:Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

【问题讨论】:

    标签: sql-server-2008 asp.net-webpages


    【解决方案1】:

    您遇到的问题是查询命令耗时过长。我相信执行查询的默认超时时间是 15 秒。您需要设置 CommandTimeout(以秒为单位),以便命令有足够长的时间来完成其执行。 “CommandTimeout”与连接字符串中的“Connection Timeout”不同,必须为每个命令设置。

    在你的 sql 选择事件中,使用命令:

    e.Command.CommandTimeout = 60
    

    例如:

    Protected Sub SqlDataSource1_Selecting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)
        e.Command.CommandTimeout = 60
    End Sub
    

    【讨论】:

    • 我刚刚在一个查询确实耗时太长的网络应用程序上解决了这个问题——因为没有人在数据库上为正在查询的字段创建索引!这应该是第一个停靠港:)
    【解决方案2】:

    对于所有比我了解更多的人,与其将其标记为无用或误导,不如再读一遍。由于所有资源都被锁定的线程消耗,我的虚拟机 (VM) 变得无响应时出现问题,因此终止线程是我唯一的选择。我不向任何运行长时间查询的人推荐这个,但可能对那些被无响应的虚拟机或其他东西困住的人有所帮助。由个人决定接听电话。是的,它会终止您的查询,但它保存了我的 VM 机器被破坏。

    Serverstack 已经回答了类似的问题。它解决了我在 VM 机器上使用 SQL 的问题。 请查看here

    您需要运行以下命令来修复索引问题。

    exec sp_updatestats
    

    【讨论】:

    • 这不是一个普遍适用的答案,即无论最近是否更新了索引统计信息,查询的运行时间都可以超过任何给定的超时时间。
    • 在运行前请务必阅读并理解 exec sp_updatestats 的后果。
    • 是的,我在虚拟机中面对它。
    • 这不是一个坏建议,但过于矫枉过正,需要上下文。如果由于查询速度慢而导致 CommandTimeout 被击中,这可能会修复它,因为它可以帮助 sql server 找到更好的执行计划。但是,此命令会更新所有统计信息,但问题可能是 ONE 表收到了足够多的更新来扭曲计划(即计划假设 1 行具有匹配值,但实际值为 100)。您最好使用分析器查找慢速查询,获取其执行计划,并查找实际行数和估计行数之间的巨大差异,以找到需要更新统计信息的 ONE 表。
    • @b_levitt,请理解场景,当时我正试图保存我的虚拟机。 VM 没有响应,因此保存已完成的工作对于考虑查询性能非常重要。恢复 VM 后,我尽我所能调整数据库。
    【解决方案3】:

    如果您使用 Entity Framework,您可以通过以下方式延长默认超时时间(为长时间运行的查询提供更多时间来完成):

    myDbContext.Database.CommandTimeout = 300;
    

    myDbContext 是您的 DbContext 实例,300 是以秒为单位的超时值。

    (实体框架 6 的当前语法。)

    【讨论】:

    • 谢谢,它帮助了我。这是否意味着我的查询结构不正确、太重或其他什么?我在 SQL Server Profiler 中检查了生成的 sql 事务,并没有发现任何异常。
    【解决方案4】:

    我有同样的问题。运行exec sp_updatestats 有时确实有效,但并非总是如此。我决定在我的查询中使用NOLOCK 语句来加快查询速度。 只需在 FROM 子句后添加 NOLOCK,例如:

    SELECT clicks.entryURL, clicks.entryTime, sessions.userID
    FROM sessions, clicks WITH (NOLOCK)
    WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE())
    

    阅读全文here

    【讨论】:

    • 当您的服务器正在执行大量多用户工作或大量长时间运行的报告内容时,NOLOCK 是一个很好的解决方案!
    • NOLOCK 通常是解决大多数问题的坏方法。 (blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere): 1) “脏读” 2) 缺失行 3) 读取行两次 4) 读取同一行的多个版本 5) 索引损坏 6) 读取错误等等。只需谷歌“NOLOCK 坏主意”...(在某些情况下,快照隔离可能是您的朋友)
    • 我不同意使用 NOLOCK “通常是解决大多数问题的坏方法”。这实际上取决于手头的问题以及您了解 NOLOCK 在做什么。在某些情况下,数据的整体完善性并不是很重要。在某些情况下,您应该尽量减少查询时间/锁定表所花费的时间。
    • 不使用 NOLOCK 吗?
    【解决方案5】:

    我在这里尝试了其他答案以及其他一些答案。我什至停止并重新启动了 SQL 服务。没有任何效果。

    但是,重新启动我的计算机确实有效。

    【讨论】:

    • 这工作了一段时间,但问题又回来了,需要再次重新启动,是否有真正的永久修复?
    【解决方案6】:

    查看数据库中的重新索引表。

    您可以首先找出碎片级别 - 如果它高于 10% 左右,您可以从重新索引中受益。如果它非常高,则可能会造成显着的性能瓶颈。

    http://blog.sqlauthority.com/2009/01/30/sql-server-2008-2005-rebuild-every-index-of-all-tables-of-database-rebuild-index-with-fillfactor/

    这应该定期进行。

    【讨论】:

    • tl;nr exec sp_MSforeachtable 'DBCC DBREINDEX(''?'','' '',90)'
    【解决方案7】:

    我们在从 2008 年升级到 2014 年 SQL Server 后遇到了这个错误,我们以前用于本地开发的一些连接字符串有一个 Data Source=./ 像这样

            <add name="MyLocalDatabase" connectionString="Data Source=./;Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
    

    将其从 ./ 更改为(本地)或 localhost 解决了问题。

    <add name="MyLocalDatabase" connectionString="Data Source=(local);Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
    

    【讨论】:

    • 从 SQL Server 2012 升级到 2014 后,我遇到了同样的问题。SQL Server 和 Web 服务器在不同的机器上,但将数据源从 SERVER 更改为 SERVER.domain.local 似乎 修复它。
    【解决方案8】:

    我的表没有主键,然后出现超时错误。设置密钥后,sloved。

    【讨论】:

      【解决方案9】:

      @JonSchneider 答案的 EfCore 版本

      myDbContext.Database.SetCommandTimeout(999);
      

      其中 myDbContext 是您的 DbContext 实例,999 是以秒为单位的超时值。

      (Entity Framework Core 3.1 的当前语法)

      【讨论】:

        【解决方案10】:

        在我们的案例中,我们能够将原因缩小到具有WITH SCHEMABINDING 的多个视图。尽管这应该可以提高性能,但它导致了一个糟糕的查询计划(对这些视图引用的表执行单个记录更新需要将近 2 秒的经过时间)。删除 WITH SCHEMABINDING 意味着一切都再次顺利运行,“等待操作超时”错误已经消失。

        【讨论】:

          【解决方案11】:

          我遇到了同样的问题,通过运行“exec sp_updatestats”问题解决了,现在可以正常工作了

          【讨论】:

            猜你喜欢
            • 2015-02-02
            • 2019-03-13
            • 1970-01-01
            • 2017-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-23
            相关资源
            最近更新 更多