2013-05-03 1992 views
34

我正在運行一個ASP.NET Web頁面頁面,該頁面在初始加載時從SQL服務器中拉出項目列表。這個查詢在一秒鐘左右運行,並在2秒內加載頁面。回報大約有1000條記錄,給予或承擔。我從Service Manager SQL數據庫中提取主機名以及一些其他信息。Win32Exception(0x80004005):等待操作超時

在這個頁面中,我有一個內置的搜索,本質上運行完全相同的查詢,但是使用基於主機名的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

回答

20

所有那些誰知道的比我多,而不是將其標記無益或誤導,再讀一遍。由於所有資源都被鎖定的線程佔用,我的虛擬機(VM)無法響應,因此,殺死線程是我唯一的選擇。我不會向任何正在運行長時間查詢的人推薦此功能,但可能會幫助那些無法響應VM的用戶。它的最新個人接聽電話。是的,它會殺死你的查詢,但它保存了我的VM機器被破壞。

Serverstack已經回答了類似的問題。它解決了我在VM機器上使用SQL的問題。 請檢查here

您需要運行以下命令來解決索引問題。

exec sp_updatestats 
+1

這適用於我! :) – BugLover 2014-06-10 15:59:22

+16

這不是一個普遍適用的答案,即查詢的運行時間可能超過任何給定的超時值,而不管最近索引統計信息是否已更新。 – 2014-06-24 12:59:32

+1

確保在運行之前閱讀並理解exec sp_updatestats的後果。 – redoc 2015-03-17 15:17:09

29

您遇到的問題是查詢命令花費的時間太長。我相信查詢執行的默認超時時間是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 
+0

我剛剛在一個Web應用程序中解決了這個問題,因爲查詢確實需要很長時間 - 因爲沒有人在被查詢的字段上爲數據庫創建索引!這應該是第一個呼叫端口:) – 2017-03-08 11:38:47

3

我想在這裏其他的答案以及其他幾個人。我甚至停止並重新啓動SQL服務。沒有工作。

但是,重新啓動我的電腦確實有效。

+0

Yupe,對於我也重新開始工作。 – incomplete 2015-11-15 16:29:22

+0

這工作一段時間,但問題出現,並需要另一次重新啓動,是否有一個實際的永久修復? – BlackICE 2016-02-23 15:28:19

+0

@BlackICE我還沒有回來。 – MiniRagnarok 2016-02-23 15:32:24

5

我有同樣的問題。運行exec sp_updatestats有時會奏效,但並非總是如此。我決定在我的查詢中使用NOLOCK聲明來加速查詢。 後您的FROM子句,e.g只需添加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

+0

當您的服務器執行大量多用戶工作或大量長時間運行的報告時,NOLOCK是一個很好的解決方案! – 2016-02-02 12:07:09

+3

對於大多數問題,NOLOCK通常是一個不好的解決方案。 (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/): 1)「髒讀」 2)缺失行 3)讀兩次 4)讀取多個版本的同一行 5)索引損壞 6)讀取錯誤 等等。只是谷歌'NOLOCK壞主意'...(附註快照隔離可能是你的朋友在某些情況下) – HansLindgren 2016-03-08 09:02:08

+1

我不同意使用NOLOCK是「通常是對大多數問題的不好解決方案。」這實際上取決於手頭的問題,並且你明白NOLOCK正在做什麼。有些情況下,數據的整體完善並不十分重要。還有一些情況 - 在這種情況下,應儘量減少查詢時間/鎖定表所花費的時間。 – Paul 2016-06-27 13:20:33

2

我們2008年至2014年的SQL Server在那裏我們我們的一些地方發展上一個連接字符串中有一個數據源,在升級之後遇到此錯誤= /像這樣

 <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;"/> 
+0

從SQL Server 2012升級到2014年後,我遇到了同樣的問題。SQL Server和Web服務器位於不同的機器上,但將數據源從「SERVER」更改爲「SERVER.domain.local」_seems_以修復它。 – Darren 2016-03-11 10:39:52

0

我的表沒有主鍵,然後我有超時錯誤。在設定的關鍵點之後。

4

如果您使用實體框架,你可以擴展默認的超時時間做(給長時間運行的查詢更多的時間來完成):

myDbContext.Database.CommandTimeout = 300; 

哪裏myDbContext是你的DbContext例如,而300是以秒爲單位的超時值。

(語法當前爲實體框架6)