c# - операции - истекло время ожидания соединения sql




Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает. Заявление было прекращено (8)

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

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

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

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

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

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

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

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

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

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

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

[SqlException (0x80131904): время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает. Заявление было прекращено.]
System.Data.SqlClient.SqlConnection.OnError (исключение исключения SqlException, логическое размыкание соединения) +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, 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, контекст HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (контекст приложения IntCtr, контекст 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

ИЗМЕНИТЬ ПОСЛЕ ОТВЕТОВ:
мой 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 я перезагружаю все онлайн-пользователи в Application_Start . В этой таблице содержится более 482 751 записей.


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

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

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

c.CommandTimeout = 0;

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


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

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


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


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

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

  1. Там где-то тупик
  2. Неправильная статистика статистики и / или таблица запросов
  3. Запрос слишком сложный и нуждается в настройке

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

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

exec sp_updatestats

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

dbcc freeproccache

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

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


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

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

cmd.CommandTimeout = 50

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


пытаться

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

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