【问题标题】:IDbConnection Open hangs C#IDbConnection Open 挂起 C#
【发布时间】:2016-01-18 07:33:15
【问题描述】:

连接到 SQL-Server 时,我的程序执行在 .Open() 方法上挂起的时间超过了指定的 2 秒超时。

当数据库所在的机器脱机或重新启动时,我设法重现了该问题。当该数据库所在的计算机启动时,程序的执行将取消挂起。

如何在超过 2 秒超时时强制抛出异常或其他任何东西?

我试过 OleDB 和 SqlConnection 提供程序,没有区别。

我可以在连接之前 ping 机器,但仍然存在 ping 成功的情况(比如机器关闭前 1 秒),然后打开连接挂起...

下面提供的示例代码。

public static IDbConnection GetConnection(IDbConnection connection)
{
    connection.ConnectionString = "connectionString; Connection Timeout=2;";
    connection.Open();
    return connection;
}

【问题讨论】:

  • Connection Timeout 属性只是创建连接的时间,之后的一切(连接建立后还有很多事情要做)不count可能需要无限期(除非我不知道有 另一个 超时)。您可以做的是使用 watchdog 在单独的线程中执行您自己的代码,以将总执行时间限制为 2 秒(请注意,对于 TCP 连接,2 秒是非常短的时间)。

标签: c# .net sql-server


【解决方案1】:

Connection Timeout 属性只是建立连接的时间,之后的一切(建立连接后还有很多事情要做)不计数,它可能需要无限期(除非有 另一个 我不知道的超时)。

您可以做的是在一个单独的线程中使用看门狗执行您自己的代码,以将总执行时间限制为两秒。使用任务非常简单:

const int HardConnectionTimeoutInMilliseconds = 2000;
if (!Task.Run(() => connection.Open()).Wait(HardConnectionTimeoutInMilliseconds))
    return null; // Timeout!

为了完整起见,这是旧式代码

Thread worker = new Thread(delegate()
{
    connection.Open();
});
worker.Start();

if (!worker.Join(TimeSpan.FromSeconds(2)))
     return null;

小心超时时间太短:对于 TCP 连接,两秒总是太短的时间,如果您使用带有 AD 的 Windows 身份验证,那么它可能需要比您预期的更长的时间。

在我看来,您必须忍受这种延迟(对于具有集成安全性的 TCP 连接来说,15 到 30 秒是安全且合理的时间)。您可能还想等待更多时间并重试(因为错误可能是暂时的,请参阅Know when to retry or fail when calling SQL Server from C#?),请注意您描述的情况(服务器宕机)非常不寻常,那么 IMO 它应该t 影响正常操作。如果这是您的 UI 的问题,那么您应该使您的程序并行(以保持 UI 响应)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多