簡體   English   中英

Connection.open無限期掛起,不會拋出任何異常

[英]Connection.open for hangs indefinitely, no exception is thrown

當我嘗試執行以下代碼時,程序將無限期掛起。 我不知道為什么,似乎還有其他未解答的話題。 雖然,如果無法訪問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";

然后它會拋出異常。 如何讓它為活動站點拋出異常? ...顯然, 谷歌只是出於測試目的。

編輯:

如果我嘗試連接到無法訪問的服務器名稱或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分鍾后超時並給我上面發布的錯誤。 如何讓它更快地超時?

如果您為Data Source例如example.com )設置了FQDN(完全限定域名),並且DNS服務器長時間無法解析此FQDN,則很明顯您的請求將會掛起。 確保運行應用程序的計算機可以訪問SQL Server並解決它而不會出現任何問題。 此外,您可能希望確保沒有可能阻止請求的防火牆。

這些症狀的另一個可能原因是您已經耗盡了ADO.NET的連接池。 如果您有許多並行運行的慢速SQL查詢,則會發生這種情況,每個查詢都與數據庫建立物理連接。 此池上的可用連接數有限制,當達到此限制時,下一次調用connection.Open()可能會等待將可用連接返回到池中。

備注:您可能還需要在連接字符串中指定要對SQL Server進行身份驗證的方式。 有關更多示例,請訪問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秒后超時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM