MVC 3 / EF / SQL Server странная проблема тайм-аута соединения - PullRequest
2 голосов
/ 30 января 2012

Перед прочтением, пожалуйста, обратите внимание, что я прогуглил это и прочитал тонну статей по SO и в других местах, пока никаких предложений не сработало.

Я случайно получаю сообщение об ошибке тайм-аута, которое возникает при регистрациив мое приложение MVC 3.Это происходит более половины времени - во всех остальных случаях приложение входит в систему очень хорошо.Когда он не работает, он пытается примерно 10 секунд, а затем выдает ошибки.

Ошибка:

Исключение: «Произошла ошибка при выполнении определения команды. См.внутреннее исключение для деталей. "Внутреннее исключение: {"Время ожидания истекло. Время ожидания истекло до завершения операции, либо сервер не отвечает. \ R \ nВремя ожидания истекло. Время ожидания истекло до завершения операции, или сервер не отвечает."}

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


Кажется, что это происходит при входе в систему и просто быстрой проверке из базы данных, такой как:

 return entities.Users.SingleOrDefault(user => user.UserName == userName);

 return (entities.Users.SingleOrDefault(u => u.UserId == user.UserId || u.UserName == user.UserName) != null);

То, что я пробовал:

  • Проверка SQL Server
  • Интегрированная безопасность (я даже предоставил каждой учетной записи полный доступ к базе данных)
  • Работа вне IIS
  • Настройка чрезвычайно высокого времени ожидания соединения (Connect Timeout = 50000) в строке подключения.(У меня не задано здесь Тайм-аут команды по умолчанию)
  • Установка CommandTimeout на 0, 5000, 100000, независимо от того, на моем соединении сущностей: entity.CommandTieout = 100000;
  • Установка CommandTimeout внутрикаждый оператор using, где я использую экземпляр репозитория.
  • Переключение SingleOrDefault в FirstOrDefault и т. д.
  • Включение / отключение отложенной загрузки (почему нет?)

Если это поможет:

  • Я использую пользовательскую роль и поставщика членства.
  • Я просто делаю вызовы из моего контроллера в операторе использования (AccountRepository bleh = new AccountRepository ()), а AccountRepository реализует IDisposable и т. Д.
  • Модель сущности находится в отдельном проекте.
  • Я управляю сайтом в IIS.Он настроен с помощью интегрированного пула приложений 4.0.
  • Все учетные записи имеют полный доступ к базе данных.
  • Когда возникает ошибка, она не занимает столько времени, сколько я установил в Интернете.config (я думаю, 50000) или для команды timeout в репозитории.
  • Это не сильно влияет на вход в систему, просто проверяет пользователя, получает роль пользователя, затем загружает некоторый небольшой объем данных, но ошибка всегда возникает при получениипользовательские данные при входе в систему.
  • Когда я пробую его вне отладки, он повторяет ошибку четыре или пять раз (с отключенными пользовательскими ошибками).

Вот полное исключение из журнала событий:

Exception information: 
Exception type: SqlException 
Exception message: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Вы можете изучить проблему с сервера базы данных, настроив SQL Server Profiler .

Вы можете найти много информации о SQL Profiler, просто погуглив. Вот сайт с видео, которое может помочь вам начать работу.

0 голосов
/ 31 января 2012

Редактировать: Хотя это действительно помогло мне, это не было решением.Проблема все еще существует для любого, кто читает в будущем.

Просто, чтобы все знали - я считаю, что я нашел проблему.Через SQL Profiler я увидел, что учетная запись, используемая для доступа к SQL, фактически является локальной системной учетной записью.Затем я понял, что, пытаясь решить проблему ранее, я изменил пул приложений ASP.NET v4.0 для использования учетной записи локальной системы.Я пошел и изменил Identity обратно на «ApplicationPoolIdentity», добавил пользователя IIS APPPOOL \ ASP.NET v4.0 в базу данных, и пока все работает отлично.@DOK - Большое спасибо за информацию о SQL Profiler, он очень помог!Спасибо всем также!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...