Тайм-аут базы данных при выполнении первой операции обновления в ADO.NET Entity Framework - PullRequest
1 голос
/ 24 ноября 2011

Мы создаем приложение, используя службы WCF, которые обращаются к базе данных, используя Entity Framework. Мы используем SQL Server 2005, .Net 4.0, Entity Framework 4.0 и C #. Когда службы WCF развертываются и приложение запускается, сначала операции с базой данных всегда выполняются SELECT для чтения некоторых данных, а затем при взаимодействии пользователя с приложением могут произойти некоторые обновления базы данных. Наблюдаемая проблема связана с первой операцией базы данных UPDATE, выполняемой после развертывания служб, которая обычно завершается с ошибкой:

An error occurred while updating the entries.
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Эта ошибка возникает в методе SaveChanges(), и обычно этот метод заключен в транзакцию, например:

// TransactionScopeOption.RequiresNew, IsolationLevel.ReadCommitted, Timeout = TimeSpan.FromMinutes(1)
using (TransactionScope scope = TransactionScopeUtil.CreateTransactionScope())
{
  using (var dbcontext = new DBCtx("connectionstring"))
  {
    dbcontext.Connection.Open();

    // Read and update database.

    dbcontext.SaveChanges();

    dbcontext.Connection.Close();
  }
}
scope.Complete();

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

Может быть проблема с пулом соединений с базой данных при холодном запуске?

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

1 Ответ

0 голосов
/ 24 ноября 2011

Попробуйте использовать TransactionManager.MaximumTimeout может быть, вы уже сделали это .так что, если это не проблема, то следующие вещи:

EF desinger соединение существует как «Тайм-аут команды по умолчанию», поэтому установите тайм-аут команды с некоторым значением, используя dbcontext.он установит время ожидания основной команды для контекстных команд.

context.CommandTimeout = 180;

проверьте переполнение стека вопрос для получения более подробной информации

вы должны использовать scope.Complete(); в using оператор - MSDN - Объем транзакции реализация

using(TransactionScope scope = new TransactionScope())
     {
          /* Perform transactional work here */
          scope.Complete();
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...