在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();
这个第一个数据库更新操作通常会失败,然后在重新部署服务之前再也不会失败。
可能是冷启动时数据库连接池的问题?
我们对增加连接/命令超时的解决方案/解决方案感到不舒服,因为这可能会掩盖未来的性能问题,并且数据库更新通常不是"大"。
尝试使用TransactionManager。MaximumTimeout可能是你已经这样做了。因此,如果这不是问题,那么以下内容:
EF设计器连接存在'默认命令超时',因此使用dbcontext设置命令超时值。它将为上下文命令设置底层命令超时时间。
context.CommandTimeout = 180;
查看此堆栈溢出问题以获取更多详细信息
您应该在using
语句中使用scope.Complete();
- MSDN -事务范围实现
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete();
}