所以我有一些代码连接到数据库,非常标准。
在创建的 DbContext 中,我尝试查询一个表。
当我创建 DbContext 时,我输入了一些不存在的 url,而不是实际的数据库 URL。
所以我预计在这一点上会失败,问题是,我不能让它失败的速度超过 30 秒。
我从System.Data.SqlClient.SqlInternalConnection
那里得到了一堆第一次更改异常
建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及 SQL Server 是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action'1 wrapCloseInAction)
我尝试创建自定义DbConfiguration
和 DbExecutionPolicy,但直到尝试连接很多次之后,它似乎才被调用。
public class InternalsDbConfiguration : DbConfiguration
{
public InternalsDbConfiguration()
{
this.SetExecutionStrategy("System.Data.SqlClient", () =>
{
var r = new MyExecutionStrategy();
return r;
});
}
}
public class MyExecutionStrategy : DbExecutionStrategy
{
protected override bool ShouldRetryOn(Exception exception)
{
var s = exception as SqlException;
if (s == null)
return false;
if (s.Number == 53)
return false;
return true;
}
}
我只是不能让它以超过 30 秒的速度使连接失败,因为它一直在一些我似乎无法影响的过程中旋转,看起来像一个没有任何退缩的重试策略,在它放弃并调用我的MyConnectionStratagy
来弄清楚该怎么做之前触发了 15 次。
有什么想法吗?我希望它第一次失败,不要继续尝试。
尝试将Connection Timeout=5;
添加到连接字符串,如果要增加所有后续命令,请使用DbContext.Database.CommandTimeout = 60;