Connection.open无限期挂起,不会抛出任何异常

时间:2013-05-08 19:37:56

标签: c# database database-connection sqlconnection connection-timeout

当我尝试执行以下代码时,程序会无限期挂起。我不知道为什么,似乎还有其他未解答的话题。虽然,如果无法访问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分钟后超时并给我上面发布的错误。如何让它更快地超时呢?

2 个答案:

答案 0 :(得分:6)

如果您为Data Source example.com设置了FQDN(完全限定域名),并且DNS服务器长时间无法解析此FQDN,则很明显您的请求会出去玩确保运行应用程序的计算机可以访问SQL Server并解决它而不会出现任何问题。此外,您可能希望确保没有可能阻止请求的防火墙。

出现这些症状的另一个可能原因是您已经耗尽了ADO.NET的连接池。如果您有许多并行运行的慢速SQL查询,则会发生这种情况,每个查询都与数据库建立物理连接。此池上的可用连接数有限制,当达到此限制时,下一次调用connection.Open()可能会等待将可用连接返回到池中。

备注:您可能还需要在连接字符串中指定要对SQL Server进行身份验证的方式。结帐connectionstrings.com了解更多示例。

这就是说你在问题中发布的C#代码绝对没有错。它看起来更像是一个网络相关问题,您可以引起网络管理员的注意。

答案 1 :(得分:0)

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

示例连接字符串:

Connection Timeout=240

在上述连接字符串中,<add name="MyConnectionString" connectionString=" Data Source=MyServer\MSSQL2017; Initial Catalog=MyDatabase; Integrated Security=True; Connection Timeout=10;"/> 命令将在10秒后超时