Мы создаем приложение, используя службы 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();
Эта самая первая операция обновления базы данных обычно завершается сбоем, а затем никогда не происходит сбой, пока службы не будут повторно развернуты.
Может быть проблема с пулом соединений с базой данных при холодном запуске?
Нас не устраивает решение / обходной путь увеличения тайм-аута соединения / команды, поскольку это может замаскировать проблемы с производительностью в будущем, и обновления базы данных обычно не являются «большими».