【问题标题】:In C# what is the best way to determine if a database is up and running?在 C# 中,确定数据库是否已启动并正在运行的最佳方法是什么?
【发布时间】:2009-05-29 18:57:14
【问题描述】:

我想出了以下方法来确定数据库是否已启动并正在运行。这会尝试打开一个数据库连接,如果失败则返回 false。

private static bool IsDatabaseConnectionUp(string connectionString)
{
    System.Data.SqlClient.SqlConnection conn = null;

    try
    {
        conn = new SqlConnection(connectionString);

        conn.Open();

        return conn.State == System.Data.ConnectionState.Open;
    }
    catch (SqlException)
    {
        // There was an error in opening the database so it is must not up.
        return false;
    }
    finally
    {
        if (conn != null)
        {
            if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();
            }

            conn.Dispose();
        }
    }
}

这是确定此数据库是否已启动的最佳方法吗?我不喜欢这种方法的原因是它依赖于超时值,并且只要设置了超时值就可以了。

有没有更好的办法?

【问题讨论】:

  • 你必须处理你的连接。
  • 是的。您的连接似乎处于打开状态。
  • 这只是一个示例代码,实际上我使用的是 Linq Datacontext,我正确处理了连接。

标签: c# .net database ado.net


【解决方案1】:

这实际上取决于您要确定的内容。如果您真的想确定“服务器是否正在运行并且能够被访问”,那么我会说这很可能是最有效的方式。我这样说的原因是服务器本身可能已启动,但它可能不接受连接,或者应用程序正在使用的连接可能无效(用户名/密码不正确)。

因此,鉴于此,超时是必要的,因为您想验证真正的连接。如果您只想查看服务器是否在那里,您可以尝试 ping,但这只是告诉您设备是否处于活动状态,不一定告诉您 SQL Server 是否完全启动并运行并且可用。

【讨论】:

    【解决方案2】:

    由于您专门查看 SQLServer 连接,因此将连接字符串放入 SqlConnectionStringBuilder 对象并更改超时值。

    SqlConnectionStringBuilder csb = 
       new SqlConnectionStringBuilder(connectionString);
    csb.ConnectTimeout = 5;
    string newConnectionString = csb.ToString();
    

    这样您就可以控制超时值。请记住,不要将其设置得太低,否则您会得到误报。

    【讨论】:

      【解决方案3】:

      您的模式很接近,但存在一个问题。因为 SQLConnection 实现了 IDisposable,所以您确实应该在返回测试连接之前对其进行处理。

      try
          {
              using (System.Data.SqlClient.SqlConnection conn = new SqlConnection(connectionString))
              {
      
                  conn.Open();
      
                  return conn.State == System.Data.ConnectionState.Open;
              }
          }
          catch (SqlException)
          {
              // There was an error in opening the database so it is must not up.
              return false;
          }
      

      至于其他发帖人所说的,如果您只想查看数据库实例是否正在运行,您可以枚举系统上的进程,或者使用命令行访问来测试数据库,但要么这些选项中的哪些完全取决于数据库供应商。您的方法通常适用于大多数应用程序。

      【讨论】:

        【解决方案4】:

        如果您对特定数据库(而不是整个数据库服务器)的状态感兴趣,那么是的,这将是最好的方法。

        【讨论】:

          【解决方案5】:

          如果您担心超时,可以尝试一些方法...

          您可以尝试 ping 服务器。除非禁止 ICMP 数据包,否则如果您的服务器已关闭,这将更快地告诉您。如果无法ping通,则无法连接。显然,不能保证你可以连接,但是当你不能连接时,它会让事情变得更快。

          您可以为服务器启动连接测试使用不同的连接字符串。您通常不需要完整的默认时间来建立连接,因此您可以大幅降低它。

          如果您可以允许稍微陈旧的数据,您可以有一个服务每隔 X 分钟(5 或 10 分钟或其他任何时间)检查一次连接,然后向该服务询问最新信息。这更像是Witness 的行为方式。

          【讨论】:

            【解决方案6】:

            这可能是一个简化的代码 sn-p,但你不应该有一个 conn.Dispose() 或 using(...) {...} 语句吗?

            编辑:没关系,我看到了 cmets。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-31
              • 1970-01-01
              • 2020-11-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多