EF6连接需要很长时间才能失败

3

我有一些连接到数据库的代码,非常标准。

在创建的DbContext中,我尝试查询一个表。

当我创建DbContext时,我放入了一个不存在的URL而不是实际的数据库URL。

所以我预计会失败,在这一点上,问题是,我无法让它更快地失败,最多需要30秒。

我从System.Data.SqlClient.SqlInternalConnection得到了大量的first change异常。

在建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并确认SQL Server已配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开到SQL Server的连接)

在 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秒内更快地失败,因为它似乎会通过某个进程一直旋转,我似乎无法影响它,看起来像是一个没有任何退避的重试策略,在放弃之前会尝试15次并调用我的MyConnectionStratagy来确定下一步操作。

有什么建议吗? 我希望第一次失败而不是继续尝试。


哇,@yoda,那是什么意思? - Kelly Elton
哎呀,这确实毫无意义,而且很有趣。我在凌晨3:30写下了我的评论,抱歉。 - Yoda
哈哈,没关系,我在读它的时候也像是“这是什么意思???” - Kelly Elton
1个回答

3

如果您想增加所有后续命令的超时时间,请在连接字符串中添加Connection Timeout=5;,或者使用DbContext.Database.CommandTimeout = 60;


但是这不会影响所有的命令吗?那是我的假设。 - Kelly Elton
你可以立即将其设置为其他内容,以便其他命令正常工作 :| - Michal Ciechan
没错,那很容易,但是我想说的是仅仅改变这个并不能使初始连接更快地失败,它仍然需要同样多的时间。 - Kelly Elton
好的,看起来它能正常工作。代码中ConnectionTimeout只有getter这一点就可以解释了。 - Kelly Elton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接