Тайм-аут истек. Период ожидания истек до завершения операции или сервер не отвечает. Заявление было прекращено

249

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

Полная ошибка ниже:

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

Сведения об исключении: System.Data.SqlClient.SqlException: таймаут истекший. Период ожидания истекает до завершения или сервер не отвечает. Заявление было прекращается.

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

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

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

[SqlException (0x80131904): время ожидания истекло. Период ожидания прошедшее до завершения операции или на сервере, не отвечать на запросы. Заявление было прекращено.]
System.Data.SqlClient.SqlConnection.OnError(исключение SqlException, Boolean 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, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String метод, результат DbAsyncResult) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +327
NovinMedia.Data.DbObject.RunProcedure(String storedProcName, Параметры IDataParameter [], Int32 & rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (отправитель объекта, EventArgs e) +163

[HttpException (0x80004005): время ожидания истекло. Период ожидания прошедшее до завершения операции или на сервере, не отвечать на запросы. Заявление было прекращено.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext контекст, приложение HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, контекст HttpContext, обработчики MethodInfo []) +191
System.Web.HttpApplication.InitSpecial(состояние HttpApplicationState, Обработчики MethodInfo [], IntPtr appContext, контекст HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr контекст приложения, контекст HttpContext) +407
System.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


ИЗМЕНИТЬ ПОСЛЕ ОТВЕТОВ:
my 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

У меня есть два метода для онлайн-пользователей:

  • используя Application["OnlineUsers"] = 0;
  • другой, использующий базу данных

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

  • 1
    Как говорится здесь по умолчанию 15 секунд
  • 0
    Лучше сделать анализ первопричин, Есть разные причины, чтобы вызвать такую проблему. Основным является сложная структура запроса. Я столкнулся с той же проблемой при получении изображений, которые хранятся в виде шестнадцатеричных значений в таблице.
Показать ещё 1 комментарий
Теги:
sql-server-2008-r2
connection
timeout
sqlcommand

11 ответов

287
Лучший ответ

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

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

  • Там где-то тупик
  • Ошибки базы данных и/или панели запросов неверны.
  • Запрос слишком сложный и нуждается в настройке

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

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

exec sp_updatestats

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

dbcc freeproccache

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

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

  • 34
    У меня была та же самая ошибка, но в запросе, который "просто" занял 8 сек ... и ваш совет о exec sp_updatestats решил мою проблему. Большое спасибо!
  • 2
    Решение такой проблемы почти никогда не зависит от настройки времени ожидания или размера пула соединений. Вам нужно будет погрузиться и выяснить причину. Если вам нужна помощь в устранении этой основной причины, вы можете оставить свой вопрос.
Показать ещё 5 комментариев
136

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

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

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

c.CommandTimeout = 0;

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

  • 123
    Вы также должны знать, что значение 0 не рекомендуется : значение 0 указывает на отсутствие ограничений, и его следует избегать в CommandTimeout, поскольку попытка выполнить команду будет ждать бесконечно долго. Лучше узнать, сколько времени занимает команда, и при необходимости увеличить значение Timeout.
  • 4
    Я согласен с Otiel и отклонил ваш ответ: устанавливая commandTimeout в 0, вы не даете веб-серверу шанс восстановиться с сервера базы данных, который не отвечает. Во-вторых, когда вы устанавливаете таймаут по умолчанию, вы должны рассмотреть причину. В большинстве случаев лучше исправить запрос, чем увеличивать время ожидания.
Показать ещё 2 комментария
21

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

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

  • 0
    Привет, "или вам нужно посмотреть на SQL-запрос, который вызывает тайм-аут" -> в SQL Server 2008, где я должен проверить этот тайм-аут?
  • 0
    Вам может потребоваться проверить хранимую процедуру, которая вызывается из DataLayer.OnlineUsers.Update_SessionEnd_And_Online, поскольку трассировка стека, кажется, указывает на нее. Возьмите копию действующей базы данных в тест и запустите хранимую процедуру, передав необходимые параметры, если для ее завершения требуется более 30 секунд, поэтому вы получаете тайм-аут. Я предполагаю, что у вас есть доступ к SQL Server Management Studio.
Показать ещё 2 комментария
10

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

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

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

  • 0
    этот! именно это. Моя проблема заключалась в том, что я запускал методы в другом потоке, не дожидаясь их (потому что пользователю не нужен результат этого метода, фоновый скрипт). Без избавления (используя using блоков) у меня есть эта проблема тайм-аута. Это, казалось, решило это.
  • 0
    Вы получили ошибку тайм-аута при достижении максимального пула соединений или истечении тайм-аута. Время ожидания истекло до завершения операции, или сервер не отвечает. Так как, если вы получаете максимальный достигнутый пул, имеет смысл проверить утечку соединения. но я получаю сервер не отвечает ошибка.
6

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

cmd.CommandTimeout = 50

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

5

Вы должны установить атрибут 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

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

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

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

2

У меня проблема с большими вычислениями в 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

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

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

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

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

  • 0
    Хранимая процедура не делает ничего сложного. Однако кажется, что таблица OnlineUsers блокируется во время выполнения процедуры. Попробуйте SQL Profiler, чтобы увидеть, что происходит на Application_Start
1

попробовать

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

то перестройте свой индекс

  • 5
    Можете ли вы объяснить свое решение?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню