Entity Framework v1 - исключения «Истекло время ожидания» в часы пик на веб-сайте с большим трафиком - PullRequest
1 голос
/ 21 сентября 2010

Я получаю эти исключения «System.Data.SqlClient.SqlException» в часы пик на веб-сайте с высоким трафиком (ASP.NET).

Полное исключение:

SomeMethodName
- Ex.Type: System.Data.UpdateException - Ex.Source: System.Data.Entity 
- Ex.Message: An error occurred while updating the entries. See the inner exception for     details. 
- Ex.StackTrace: 
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager     stateManager, IEntityAdapter adapter) 
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) 
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
at SomeMethodName() in c:\SomeFileName.cs:line XXXX 
at SomeMethodName() - 
Ex.Type: System.Data.SqlClient.SqlException - Ex.InnerEx.Source: .Net SqlClient Data   Provider - 
Ex.InnerEx.Message: Timeout expired. The timeout period elapsed prior to completion of    the operation or the server is not responding. The statement has been terminated. -
Ex.InnerEx.StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException    exception, Boolean breakConnection) 
at System.Data.SqlClient.SqlInternalConnection.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.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 
at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator  translator, EntityConnection connection, Dictionary`2 identifierValues, List`1  generatedValues) 
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) - 
Ex.InnerEx.Data[HelpLink.ProdName]: Microsoft SQL Server -   Ex.InnerEx.Data[HelpLink.ProdVer]: 10.00.2531
- Ex.InnerEx.Data[HelpLink.EvtSrc]: MSSQLServer - Ex.InnerEx.Data[HelpLink.EvtID]: -2 -   Ex.InnerEx.Data[HelpLink.BaseHelpUrl

Я использую Entity Framework версии 1 на сервере, на котором установлен .NET Framework 4.0. База данных SQL Server 2008 Std 64-разрядная. Код, который выдает исключение, выглядит следующим образом:

using (TransactionScope scope = new TransactionScope())
{
    //Code

    using (DataEntities context = new DataEntities())
    {
        context.AddToListingSet(newListing); //Exception is thrown here
        context.SaveChanges();
    }

    //More code

    scope.Complete();
}

Как упоминалось ранее, это в основном происходит в часы пик. В непиковые часы исключение не выдается.

Может быть, Entity Framework не может обрабатывать все данные, которые он получает? Удаление кода транзакции для меня не вариант.

Ответы [ 2 ]

3 голосов
/ 21 сентября 2010

Нет, проблема не в том, что «Entity Framework не может обрабатывать все данные, которые он получает». Вы делаете INSERT, а не выбор. Проблема заключается в том, что выполнение SQL-запроса занимает больше времени, чем установка тайм-аута в базе данных или строке соединения, поэтому он прерывается.

На основании показанного вами кода маловероятно, что оператор INSERT ошибочен (если у вас нет триггеров или другого кода, который вы нам не показываете). Более вероятно, что какой-то другой запрос выполняется из параллельного процесса, который блокирует используемые таблицы. Но это предположение с моей стороны. Вам нужно будет провести некоторый анализ производительности SQL Server, чтобы найти основную проблему. Код в исключении здесь является симптомом, а не причиной.

2 голосов
/ 05 октября 2010

Я выяснил, почему мой код иногда генерирует исключения в часы пик.Внутри моего TransactionScope я выполняю некоторый системный IO (сохраняя загруженные изображения в файловую систему) прямо перед вызовом

scope.Complete();

Системный IO является относительно медленным процессом, приводящим к блокировке моей таблицы Listingв течение более длительного периода времени.

Перемещая системный ввод-вывод за пределы TransactionScope, я больше не получаю исключения (в моем случае можно использовать системный ввод-вывод вне TransactionScope).

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