【发布时间】:2019-07-17 23:01:31
【问题描述】:
在我的应用程序中,我已将连接字符串的连接超时属性设置为 10 秒。我已经通过在调用 Open 之前检查 SqlConnection 对象上的 ConnectionTimeout 属性来验证这一点。但是,当我尝试打开与无法访问的服务器的连接时,大约需要一分钟才能引发异常,而不是 10 秒。
具体错误是:
System.Data.SqlClient.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理:“建立与 SQL 的连接时发生与网络相关或特定于实例的错误服务器。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)
在我的情况下,目标服务器只是关闭了。使用 SQL Server Management Studio 尝试连接到同一服务器时,连接失败同样需要大约一分钟时间。
更新
我创建了一个 C# 控制台应用程序进行测试,并将超时值设置为 3 秒。如果我使用 IP 地址,无论连接超时有多低,我都会在 47 秒左右超时。如果我使用任意字符串,那么我得到的超时大致相当于我指定的超时。所以这个问题与使用 IPV4 地址而不是域名有关。这是测试应用程序:
using System;
using System.Data.SqlClient;
using System.Diagnostics;
namespace test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hi Mom, I'm on the internet!");
string conn_str =
"Data Source=<Some Address>;" +
"Initial Catalog=BLAHBLA;" +
"User ID=HOOTENANY;" +
"Password=password;" +
"Connect Timeout=3";
using (SqlConnection conn = new SqlConnection(conn_str)) {
Console.WriteLine(conn.ConnectionTimeout);
Stopwatch stopWatch = Stopwatch.StartNew();
try {
conn.Open();
}
catch (Exception ex) {
Console.WriteLine("Time till error: " + stopWatch.Elapsed.Seconds.ToString() + " seconds.");
}
}
}
}
}
【问题讨论】:
-
我知道您说您对此很确定,但许多应用程序确实依赖于此。您能否分享一个演示此行为的简单代码示例,我无法直接使用 SqlConnection 重现您的问题,但我发现这可能发生在配置错误的 EF 实现中。
-
并添加 nslookup 的输出作为主机名。需要查看是否有多个IP。
-
@DavidBrowne-Microsoft,不是多个 IP,因为问题与直接使用 IP 有关。
-
哇! @DavidBrowne-Microsoft 如果我使用 IP4 地址作为数据源,我可以准确地重现该问题!除非超时 5 秒或更长,否则总是 21 秒
标签: sql-server .net-core connection-timeout