SQL Server 初始数据库连接在 30 秒内超时

问题描述 投票:0回答:2

我正在 .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)
之前?

c# sql-server timeout
2个回答
1
投票

有一个

CommandTimeout
和一个
ConnectionTimeout
,它们是两个不同的东西。问题中的代码正在设置
CommandTimeout
,但很可能
ConnectionTimeout
才是真正让你绊倒的。

ConnectionTimeout
可以设置为连接字符串的一部分,或者通过访问 DBContext 的底层 ADO.Net
DbConnection
(
DbContext.ObjectContext.Connection
)


0
投票

建立在乔尔上述答案的基础上..

如果您构建对 sql 的命令调用,则默认值以秒为单位,并且为 30.. 以便网络服务器允许返回数据。

            // Read the default time
            int defTime = cmd.CommandTimeout;  
            
            // commandTimeout is in seconds, default is 30.
            cmd.CommandTimeout = 59;

这样每个命令都可以独立分配额外的时间。

© www.soinside.com 2019 - 2024. All rights reserved.