【问题标题】:ADO.NET: Faster way to check if the database server is accessible?ADO.NET:检查数据库服务器是否可访问的更快方法?
【发布时间】:2010-05-04 00:13:33
【问题描述】:

目前我正在使用此代码检查数据库是否可访问:

public bool IsDatabaseOnline(string con)
{
    bool isConnected = false;
    SQLConnection connect = null;

    try {
        connect = new SQLConnection(con);
        connect.Open();
        isConnected = true;

    } catch (Exception e) {
        isConnected = false;

    } finally {
        if (connect != null)
            connect.Close();
    }

    return isConnected;
}

虽然这段代码运行良好,但也有一个缺点。如果服务器不在线,它会花费大约 4 秒的时间尝试打开连接,然后才确定它不可用。

有没有办法在不尝试实际打开连接并等待超时的情况下测试连接?类似于 ping 的数据库?

【问题讨论】:

  • 您认为您的服务器会长时间停机吗?
  • 你应该把它改成catch (SqlException)

标签: c# database ado.net connection


【解决方案1】:

您可以将连接超时更改为更短。做一些测试,看看你能走多低并且仍然可靠。我打赌你可以接近 500 毫秒。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

【讨论】:

  • 如果ConnectionTimeout 以秒为单位,你想如何指定 500 毫秒?
【解决方案2】:

我的方法(成功连接后)是进行不依赖于表的选择,例如时间。 在 MS SQL Server 中:

"选择 Sysdatetime()"

【讨论】:

    【解决方案3】:

    是和不是。

    您可以随时记下您的服务器侦听的端口,然后尝试使用套接字直接连接到该端口。然后如果你成功了,你可以“假设”它在线,但这可能并不取决于你的网络环境。这是最像“ping”的方法。当然,那里可能正在监听其他东西,但在数据库暂时停机的标准环境中,这可能不太可能。

    另外,如果您的数据库位于专用机器上,您可以实际上 ping 它。但这只会检查机器是否启动,而不是数据库服务器。

    最后的选择是让一些后台服务器持续监控数据库服务器,当检测到它离线时,它会适当地标记一些东西。然后,您的应用会检查 那个 东西(实际上是缓存),它几乎是立即的。当然,这意味着它可能会给出假阴性(即服务器可能在线但监控服务尚未更新缓存)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2017-09-01
      相关资源
      最近更新 更多