2013-05-03 2 views
34

Я запускаю страницу веб-страниц ASP.NET, которая при начальной загрузке выводит список элементов с SQL-сервера. Этот запрос выполняется через секунду или около того и загружает страницу в течение 2 секунд. Возврат составляет около 1000 записей, дайте или возьмите. Я вытаскиваю Hostnames из базы данных SQL Service Manager вместе с другой информацией.Win32Exception (0x80004005): Ожидаемая операция ожидания

Внутри этой страницы у меня есть поиск, в котором по существу выполняется тот же самый запрос, но выполняется с помощью LIKE на основе имени хоста. Это загружает одну и ту же страницу со всеми именами хостов, которые содержат часть поискового запроса. Обычно запрос выполняется в SQL Management Studio менее чем за секунду, но загрузка страницы занимает значительно больше времени, а иногда и времени.

Мой вопрос: почему поиск по параметрам занимает намного больше времени, а иногда и таймаут без видимых причин. Есть ли какие-либо шаги, которые можно предпринять для смягчения этого таймаута? Ниже приведена полная ошибка.

Ошибка сервера в приложении «/».


The wait operation timed out 

Описание: Необработанное исключение при выполнении текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении:

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, которая будет уничтожена.

Serverstack уже ответил на аналогичный вопрос. Он решил мою проблему с SQL на машине VM. Пожалуйста, проверьте here

Чтобы устранить проблемы с индексами, вам необходимо выполнить следующую команду.

exec sp_updatestats 
+1

Это сработало для меня! :) – BugLover

+16

Это не общий ответ, т. Е. Запросы могут работать дольше, чем любой заданный тайм-аут, независимо от того, обновлена ​​ли статистика индекса в последнее время. –

+1

Перед запуском обязательно прочитайте и поймите последствия exec sp_updatestats. – redoc

29

Проблема, с которой вы сталкиваетесь, заключается в том, что команда запроса занимает слишком много времени. Я считаю, что тайм-аут по умолчанию для выполнения запроса составляет 15 секунд. Вам нужно установить CommandTimeout (в секундах), чтобы он был достаточно длинным, чтобы команда завершила его выполнение. «CommandTimeout» отличается от «Таймаут соединения» в вашей строке подключения и должен быть установлен для каждой команды.

В вашем SQL Selecting события, используйте команду:

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

Я просто решил эту проблему в веб-приложении, где запрос действительно занимал слишком много времени - потому что никто не создал индекс в БД для поля, которое запрашивалось! Это должен был быть первый порт захода :) –

3

Я попробовал другие ответы здесь, а также несколько других. Я даже остановился и перезапустил службы SQL. Ничего не получилось.

Однако перезагрузка моего компьютера действительно сработала.

+0

Yupe, для меня также перезагрузка действительно работала. – incomplete

+0

Это работает какое-то время, но проблема возвращается, и требуется повторный перезапуск, существует ли постоянное исправление? – BlackICE

+0

@BlackICE У меня его не было. – MiniRagnarok

5

У меня была та же проблема. Запуск exec sp_updatestats действительно работал, но не всегда. Я решил использовать оператор NOLOCK в своих запросах, чтобы ускорить выполнение запросов. Просто добавьте 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 - отличное решение, когда ваш сервер делает много многопользовательской работы или много многолетних отчетов! –

+3

NOLOCK обычно является плохим решением большинства проблем. (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/): 1) "Грязные чтения" 2) Отсутствует строка 3) Чтения строк дважды 4) Чтение нескольких версий та же строка 5) Повреждение индекса 6) Считать ошибку и более. Просто google «NOLOCK bad idea» ... (в некоторых случаях может быть ваш друг в Snapshot Isolation) – HansLindgren

+1

Я не согласен с тем, что использование NOLOCK «обычно является плохим решением большинства проблем». Это действительно зависит от проблемы и что вы понимаете, что делает NOLOCK. Существуют некоторые сценарии, в которых общее совершенствование данных не очень важно. Существуют также сценарии, где это возможно - в этом случае вы должны минимизировать время и время запроса, затрачиваемое на заблокированные таблицы. – Paul

4

Просмотрите таблицу переиндексации в базе данных.

Сначала вы можете узнать уровень фрагментации - и если он превышает 10% или около того, вы можете воспользоваться повторной индексацией. Если он очень высок, вероятно, это создает значительную шею бутылки с производительностью.

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

Это должно быть сделано на регулярной основе.

2

Мы столкнулись с этой ошибкой после обновления с 2008 до 2014 SQL Server, где наши некоторые из наших предыдущих строк соединения для местного развития имели источник данных =. /, Как этот

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

Изменения, что от ./ к проблема (локальная) или локальная.

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

У меня была такая же проблема после обновления с SQL Server 2012 до 2014 года. SQL Server и веб-сервер были на разных машинах, но сменили источник данных с «SERVER» на «SERVER.domain.local» _seems_, чтобы исправить его. – Darren

0

В моей таблице нет первичного ключа, тогда у меня была ошибка времени. после того, как установлен ключ.

4

Если вы используете Entity Framework, вы можете продлить время ожидания по умолчанию (чтобы дать затянувшийся запрос больше времени для завершения), выполнив:

myDbContext.Database.CommandTimeout = 300; 

Где myDbContext ваш экземпляр DbContext, и 300 - это значение таймаута в секундах.

(ток синтаксиса по отношению к платформе сущностей 6.)

Смежные вопросы