代码之家  ›  专栏  ›  技术社区  ›  David Basarab

在C中,确定数据库是否已启动并运行的最佳方法是什么?

  •  2
  • David Basarab  · 技术社区  · 15 年前

    我想出了以下方法来确定数据库是否已启动并正在运行。这将尝试打开数据库连接,如果失败,则返回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();
            }
        }
    }
    

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

    有更好的方法吗?

    6 回复  |  直到 15 年前
        1
  •  2
  •   Mitchel Sellers    15 年前

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

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

        2
  •  2
  •   Walden Leverich    15 年前

    由于您专门查看一个SQLServer连接,请将连接字符串放入一个SQLConnectionStringBuilder对象中,并更改超时值。

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

    这样就可以控制超时值。记住,不要把它设得太低,否则你会得到误报。

        3
  •  1
  •   womp    15 年前

    你的模式很接近,但有一个问题。因为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
  •  0
  •   Tom van Enckevort    15 年前

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

        5
  •  0
  •   JP Alioto    15 年前

    如果你担心超时,有一些事情你可以尝试…

    您可以尝试对服务器执行ping操作。除非不允许使用ICMP数据包,否则这将更快地告诉您服务器是否已关闭。如果不能ping,则无法连接。很明显,这并不能保证你可以连接,但如果你不能,它会使事情变得更快。

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

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

        6
  •  0
  •   Jeff Meatball Yang    15 年前

    这可能是一个简化的代码段,但您不应该有conn.dispose()或使用(…)…语句吗?

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