我正在 .Net6(非核心)上使用 C# Web API 来访问 Azure 上的 SQL Server 数据库。有时数据库连接会在 30 秒内超时。
在
Main
我这样做...
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextPool<MyContext>(options => options.UseSqlServer(ConnStr));
var app = builder.Build();
我尝试更改
MyContext
构造函数中的超时...
public MyContext(DbContextOptions<MyContext> options) : base(options)
{
Database.SetCommandTimeout(230); // 230 is the maximum allowed by azure
}
有时这会有所帮助,但有时我仍然会看到 30 秒超时。 也许是因为
base(options)
花费的时间太长了。
我现在的解决方法是创建一个返回 hello world 的“ping”API,然后客户端在尝试其他操作之前必须调用“ping”来“唤醒”服务器。显然这不是一个理想的解决方案。
有什么建议如何更好地修复吗?是否可以提前将超时设置为 230,即在调用
base(options)
之前?
有一个
CommandTimeout
和一个ConnectionTimeout
,它们是两个不同的东西。问题中的代码正在设置 CommandTimeout
,但很可能 ConnectionTimeout
才是真正让你绊倒的。
ConnectionTimeout
可以设置为连接字符串的一部分,或者通过访问 DBContext 的底层 ADO.Net DbConnection
(DbContext.ObjectContext.Connection
)
建立在乔尔上述答案的基础上..
如果您构建对 sql 的命令调用,则默认值以秒为单位,并且为 30.. 以便网络服务器允许返回数据。
// Read the default time
int defTime = cmd.CommandTimeout;
// commandTimeout is in seconds, default is 30.
cmd.CommandTimeout = 59;
这样每个命令都可以独立分配额外的时间。