在ADO中执行第一次更新操作时数据库超时.. NET实体框架

本文关键字:超时 数据库 NET 实体 框架 操作 ADO 执行 第一次 更新 | 更新日期: 2023-09-27 18:15:39

我们正在创建一个使用WCF服务的应用程序,该服务使用实体框架访问数据库。我们使用的是SQL Server 2005、。net 4.0、实体框架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();

这个第一个数据库更新操作通常会失败,然后在重新部署服务之前再也不会失败。

可能是冷启动时数据库连接池的问题?

我们对增加连接/命令超时的解决方案/解决方案感到不舒服,因为这可能会掩盖未来的性能问题,并且数据库更新通常不是"大"。

在ADO中执行第一次更新操作时数据库超时.. NET实体框架

尝试使用TransactionManager。MaximumTimeout可能是你已经这样做了。因此,如果这不是问题,那么以下内容:

EF设计器连接存在'默认命令超时',因此使用dbcontext设置命令超时值。它将为上下文命令设置底层命令超时时间。

context.CommandTimeout = 180;

查看此堆栈溢出问题以获取更多详细信息

您应该在using语句中使用scope.Complete(); - MSDN -事务范围实现

using(TransactionScope scope = new TransactionScope())
     {
          /* Perform transactional work here */
          scope.Complete();
     }