Тайм-аут истек. Время ожидания истекло до завершения операции или сервер не отвечает. Заявление было прекращено - PullRequest
265 голосов
/ 22 декабря 2011

У меня много пользователей на моем веб-сайте (20000-60000 в день), который является сайтом загрузки для мобильных файлов.У меня есть удаленный доступ к моему серверу (Windows Server 2008-R2).Ранее я получал «Сервер недоступен» , но теперь я вижу ошибку тайм-аута соединения.Я не знаком с этим - почему это происходит и как я могу это исправить?

Полная ошибка приведена ниже:

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

Сведения об исключении: System.Data.SqlClient.SqlException: Истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Оператор был прерван.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение.Информацию о происхождении и местонахождении исключения можно определить с помощью следующей трассировки стека исключений.

Трассировка стека:

[SqlException (0x80131904): истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Оператор был прерван.]
System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) + 404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () + 412
System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) + 1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader DS, RunBehavior runBehavior, String resetOptionsString) + 6387741 * тысяча двадцать две* System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, логический асинхронный) + 6389442
System.Data.Sqlehae ReeBehBehBeachРезультат DbAsyncResult) + 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (результат DbAsyncResult, метод String methodName, логическое значение sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () + 327
NovinMedia.Data.DbObject.RunProcedure (строка хранимых параметров ProProName, IDataParameter [], Int32 & columnsActed) + 209
DataLayOnd_Ond_OUID_OUID_OUID_OUID_OIDObject Session_End, Boolean Online) + 440
NiceFileExplorer.Global.Application_Start (Отправитель объекта, EventArgs e) + 163

[HttpException (0x80004005): истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Оператор был прерван.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (контекст HttpContext, приложение HttpApplication) + 4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWttpIntextTentInteTisPTTTIN
System.Web.HttpApplication.InitSpecial (состояние HttpApplicationState, обработчики MethodInfo [], IntPtr appContext, контекст HttpContext) + 352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (контекст IntPttt).Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) + 375

[HttpException (0x80004005): истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.Заявление было прекращено.]
System.Web.HttpRuntime.FirstRequestInit (контекст HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (контекст HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, контекст HttpContext) + 4863749


РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТОВ:
мой Application_Start в Global.asax, как показано ниже:

protected void Application_Start(object sender, EventArgs e)
{
    Application["OnlineUsers"] = 0;

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

Вызывается хранимая процедура:

ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online]
    @Session_End datetime,
    @Online bit
As
Begin
    Update OnlineUsers
    SET
        [Session_End] = @Session_End,
        [Online] = @Online

End

У меня есть два способа получить пользователей онлайн:

  1. с использованием Application["OnlineUsers"] = 0;
  2. другой использует базу данных

Итак, для метода # 2 я сбросил все OnlineUsers на Application_Start. В этой таблице более 482 751 записей.

Ответы [ 14 ]

306 голосов
/ 22 декабря 2011

Похоже, у вас есть запрос, который занимает больше времени, чем следовало бы. По трассировке стека и коду вы сможете точно определить, что это за запрос.

Этот тип таймаута может иметь три причины;

  1. Где-то тупик
  2. Статистика базы данных и / или кэш плана запросов неверны
  3. Запрос слишком сложный и требует настройки

Тупик может быть трудно исправить, но легко определить, так ли это. Подключитесь к своей базе данных с помощью Sql Server Management Studio. На левой панели щелкните правой кнопкой мыши узел сервера и выберите Activity Monitor . Посмотрите на запущенные процессы. Обычно большинство будет бездействующим или работающим. Когда возникает проблема, вы можете идентифицировать любой заблокированный процесс по состоянию процесса. Если вы щелкнете правой кнопкой мыши по процессу и выберете details , он покажет вам последний запрос, выполненный процессом.

Вторая проблема заставит базу данных использовать неоптимальный план запроса. Это можно решить, очистив статистику:

exec sp_updatestats

Если это не сработает, вы также можете попробовать

dbcc freeproccache

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

Я уже коснулся третьей проблемы, но вы можете легко определить, нуждается ли запрос в настройке, выполнив запрос вручную, например, с помощью Sql Server Management Studio. Если выполнение запроса занимает слишком много времени, даже после сброса статистики вам, вероятно, потребуется настроить его. Для получения справки вы должны опубликовать точный запрос в новом вопросе.

140 голосов
/ 22 декабря 2011

В вашем коде, где вы запускаете хранимую процедуру, у вас должно быть что-то вроде этого:

SqlCommand c = new SqlCommand(...)
//...

Добавьте такую ​​строку кода:

c.CommandTimeout = 0;

Это будет ждать столько же временипо мере необходимости для завершения операции.

23 голосов
/ 22 декабря 2011

Можно установить свойство CommandTimeout команды SQL, чтобы разрешить длительную транзакцию SQL.

Вам также может понадобиться посмотреть на SQL-запрос, который вызывает тайм-аут.

12 голосов
/ 20 февраля 2015

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

Microsoft признала проблему и исправила ее в 2011 году для поддерживаемых операционных систем, поэтому, если вы получите трассировку стека, например:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)

вам может потребоваться обновить сборки .NET.

Эта проблема возникает из-за ошибки в повторной попытке подключения алгоритм для зеркальных баз данных.

При использовании алгоритма повтора поставщик данных ожидает вызов первого чтения (SniReadSync) для завершения. Звонок отправлен на внутренний компьютер, на котором запущен SQL Server, и время ожидания рассчитывается путем умножения значения времени ожидания соединения на 0,08. Однако провайдер данных неправильно устанавливает соединение с обреченным указать, является ли ответ медленным, и если первый вызов SniReadSync не завершено до истечения времени ожидания.

Подробнее см. KB 2605597

https://support.microsoft.com/kb/2605597

9 голосов
/ 19 февраля 2015

Может быть, это кому-нибудь пригодится. Я столкнулся с той же проблемой, и в моем случае причина была в том, что SqlConnection был открыт и не размещен в методе, который я вызывал в цикле с 2500 итерациями. Пул соединений исчерпан. Правильная утилизация решила проблему.

6 голосов
/ 29 июня 2015

Я столкнулся с той же проблемой, работал над этим около 3 дней. Я заметил, что наше количество записей невелико, наш старший разработчик хранит в базе данных 2 изображения и отпечаток пальца. Когда я пытаюсь получить эти шестнадцатеричные значения, которые занимают много времени, я вычисляю среднее время выполнения моей процедуры, которое составляет около 38 секунд. Время ожидания команды по умолчанию составляет 30 секунд, поэтому оно меньше среднего времени, необходимого для запуска моей хранимой процедуры. Я установил свой тайм-аут команды, как показано ниже

cmd.CommandTimeout = 50

и работает нормально, но иногда, если ваш запрос занимает более 50 секунд, он выдаст ту же ошибку.

5 голосов
/ 25 апреля 2017

Вы должны установить атрибут CommandTimeout.Вы можете установить атрибут CommandTimeout в дочернем классе DbContext.

public partial class StudentDatabaseEntities : DbContext
{
    public StudentDatabaseEntities()
        : base("name=StudentDatabaseEntities")
    {
        this.Database.CommandTimeout = 180;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<StudentDbTable> StudentDbTables { get; set; }
}
4 голосов
/ 10 сентября 2014

Я недавно столкнулся с этой ошибкой и после небольшого расследования обнаружил, что причина в том, что у нас заканчивается свободное место на диске с базой данных (менее 1 ГБ).

Как только я вышелфайлы базы данных (.mdf и .ldf) на другой диск на том же сервере (с большим количеством места), ту же страницу (выполняющую запрос), время ожидания которой было загружено в течение трех секунд.

Один другойПри попытке устранить эту ошибку необходимо изучить размер файлов журнала базы данных.Ваши файлы журналов, возможно, просто должны быть сокращены.

3 голосов
/ 27 декабря 2016

У меня проблема с большими вычислениями в sp_foo, которые занимают много времени, поэтому я исправил
с этим маленьким битовым кодом

public partial class FooEntities : DbContext
{
   public FooEntities()
         : base("name=FooEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // Sets the command timeout for all the commands
        objectContext.CommandTimeout = 380;
    }
2 голосов
/ 22 декабря 2011

@ SilverLight .. Это явно проблема с объектом базы данных. Это может быть плохо написанный запрос или отсутствующие индексы. Но на данный момент я не буду предлагать вам увеличивать время ожидания, не исследуя проблему с вашими объектами базы данных

NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209

Поместите точку останова в эту строку кода, чтобы узнать имя процедуры, а затем оптимизируйте процедуру, посмотрев на ее план выполнения.

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

...