连接.打开for无限期挂起,不会抛出异常

本文关键字:抛出异常 挂起 打开 for 无限期 连接 | 更新日期: 2023-09-27 18:12:49

当我尝试执行以下代码时,程序无限期挂起。我不知道为什么,在这个问题上似乎还有其他没有答案的话题。虽然,如果IP'网站无法访问,那么它会按预期工作。

    private void DoStuff()
    {
        string connectionString = "Data Source=www.google.com;Connection Timeout=5";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open(); //Hangs here indefinitely
            Console.WriteLine("Test");
        }
    }

例如,如果我将连接字符串设置为

connectionString = "Data Source=www.nonexistentsite.com;Connection Timeout=5";

则会抛出异常。如何让它为活动站点抛出异常?…而且google显然只是为了测试的目的。

编辑:

如果我尝试连接到一个不可达的服务器名称或IP地址,我得到这个异常…

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

更新:

让程序运行一段时间后,它通常会在3-5分钟后超时,并给出我上面发布的错误。我怎样才能让它更快地超时?

连接.打开for无限期挂起,不会抛出异常

如果您已经为Data Source(如example.com)设置了FQDN(完全合格域名),并且DNS服务器长时间无法解析此FQDN,那么很明显您的请求将挂起。确保运行应用程序的机器能够访问SQL服务器并解决它,而不会出现任何问题。此外,您可能还需要确保没有可能阻止请求的防火墙。

造成这些症状的另一个可能原因是ADO.NET的连接池已耗尽。如果并行运行许多速度较慢的SQL查询,并且每个查询都需要一个到数据库的物理连接,就可能发生这种情况。此池中的可用连接数有限制,当达到此限制时,下一次对connection.Open()的调用可能会等待将可用连接返回到池中。

备注:您可能还需要在连接字符串中指定您希望如何对SQL服务器进行身份验证。查看connectionstrings.com查看更多示例。

所有这些都是说,在你的问题中发布的c#代码中绝对没有任何错误。它看起来更像是一个网络相关的问题,您可以提请网络管理员注意。

要使连接在指定时间后退出而不成功,可以在连接字符串中使用Connection Timeout参数。您指定的数字以秒为单位,例如,Connection Timeout=240等于240秒'60秒= 4分钟。

示例连接字符串:

<add name="MyConnectionString"
connectionString="
Data Source=MyServer'MSSQL2017;
Initial Catalog=MyDatabase;
Integrated Security=True;
Connection Timeout=10;"/>

在上述连接字符串中,Open()命令将在10秒后超时