在C#中,确定数据库是否正在运行的最佳方法是什么?

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

这是确定数据库是否正常的最佳方法吗?我不喜欢这种方法的原因是它依赖于超时值,并且需要等待设置的超时时间。

有更好的方法吗?


1
你必须处理好你的连接。 - tuinstoel
是的,看起来你没有关闭连接。 - Tim Scarborough
这只是一个示例代码,在实际情况中我使用的是 Linq Datacontext,我会正确地处理连接并将其释放。 - David Basarab
6个回答

3
这主要取决于您想要确定的内容。如果您真的想确定“服务器正在运行并且可以访问”,那么我认为这可能是最有效的方式。我之所以这么说是因为服务器本身可能会运行,但它可能不接受连接,或者应用程序使用的连接可能无效(用户名/密码不正确)。
因此,考虑到这一点,超时是必需的,因为您希望验证真正的连接。如果您只想查看服务器是否存在,可以尝试ping它,但那只告诉您设备是否活动,而不一定是SQL Server完全运行和可用。

2

由于您特别关注SQLServer连接,因此请将连接字符串传递给一个SqlConnectionStringBuilder对象并更改超时值。

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

通过这种方式,您可以控制超时值。记住不要将其设置得太低,否则会出现错误的结果。


1

你的模式接近正确,但是有一个问题。因为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;
    }

关于其他帖子中提到的内容,如果你只是想查看数据库实例是否正在运行,你可以枚举系统上的进程,或使用命令行访问来测试数据库,但这两个选项都完全取决于数据库供应商。对于大多数应用程序来说,您的方法通常是可以的。

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

0

如果您担心超时问题,有几个方法可以尝试...

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

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

如果您可以允许略微过时的数据,则可以有一个服务每隔X分钟(5或10或其他)去检查连接,然后请求该服务获取最新信息。这更像是Witness的操作方式。


0

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

编辑:算了,我看到注释了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接