如何检查数据库可用性

Posted

技术标签:

【中文标题】如何检查数据库可用性【英文标题】:How to check for database availability 【发布时间】:2013-04-16 18:34:02 【问题描述】:

我有以下代码来测试数据库连接,它会定期运行以测试数据库可用性:

private bool CheckDbConn()

   SqlConnection conn = null;
   bool result = true;

   try
   
       conn = DBConnection.getNewCon();
       ConnectionState conState = conn.State;

       if (conState == ConnectionState.Closed || conState == ConnectionState.Broken)
       
          logger.Warn(LogTopicEnum.Agent, "Connection failed in DB connection test on CheckDBConnection");
          return false;
                    
   
   catch (Exception ex)
   
      logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
      return false; // any error is considered as db connection error for now
   
   finally
   
      try
      
         if (conn != null)
         
            conn.Close();
         
      
      catch (Exception ex)
      
         logger.Warn(LogTopicEnum.Agent, "Error closing connection on CheckDBConnection", ex);
         result = false;
      
   
   return result;

还有:

static public SqlConnection getNewCon()

    SqlConnection newCon = new SqlConnection();
    newCon.ConnectionString = DBConnection.ConnectionString; // m_con.ConnectionString;
    newCon.Open();
    return newCon;

我的问题是:这会按预期工作吗?

具体来说,我很关心ConnectionState 的测试。状态是否可能是:正在连接(因为Open() 是同步的)?

这种情况我该怎么办?

【问题讨论】:

我不能评论所以... ...也避免捕获一般异常“catch(Exception ex)”并尝试捕获特定异常,例如上面的示例“catch(SqlException ex)” 【参考方案1】:

你可以这样试试。

    public bool IsServerConnected()
    
        using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString))
        
            try
            
                l_oConnection.Open();
                return true;
            
            catch (SqlException)
            
                return false;
            
        
    

【讨论】:

如果 l_oConnection.Close();会在 finally 块中抛出异常吗? 使用...关闭并释放连接,无需关闭 我正在使用它,但发现它在数据库脱机后的第一次调用中返回 true。这是针对 sql server 2012 db 使用 .Net 3.5。【参考方案2】:

SqlConnection 在无法连接到服务器时会抛出一个SqlException

public static class SqlExtensions

    public static bool IsAvailable(this SqlConnection connection)
    
        try
        
            connection.Open();
            connection.Close();
        
        catch(SqlException)
        
            return false;
        

        return true;
    

用法:

using(SqlConnection connection = GetConnection())

    if(connection.IsAvailable())
    
        // Success
    

【讨论】:

【参考方案3】:

您的代码看起来不错,但您确实需要使用 IDisposable 模式以及一些命名约定:

private bool CheckDbConnection(string connectionString)

    try
    
        using(var connection = new SqlConnection(connectionString))
        
            connection.Open();
            return true;
        
    
    catch (Exception ex)
    
        logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
        return false; // any error is considered as db connection error for now
    

并且connection.Close() 不应该抛出。只需使用using 块就可以了。

无需测试Close 状态,因为您刚刚打开它。More about the Broken state:

Broken 与数据源的连接已断开。这可能发生 只有在打开连接之后。此状态下的连接 可能会关闭然后重新打开。 (这个值是为将来保留的 产品的版本。)

真的,没必要测试。

如果您在多线程上下文中并且您的连接实例是共享的,则Connecting 状态可能会被捕获。但这里不是你的情况。

【讨论】:

【参考方案4】:

如果调用此代码,则不会阻塞 UI。

public static class DatabaseExtensions

    public static async Task<bool> IsConnectionViable(this string connectionStr)
    
        await using var sqlConn = new SqlConnection(connectionStr);
        return await sqlConn.IsConnectionViable();
    

    public static async Task<bool> IsConnectionViable(this SqlConnection connection)
    
        var isConnected = false;

        try
        
            await connection.OpenAsync();
            isConnected = (connection.State == ConnectionState.Open);
        
        catch (Exception)
        
            // ignored
        

        return isConnected;
    

【讨论】:

【参考方案5】:

实际上,在 Visual Studio 中,连接类具有 sonnectionstate 属性。

当连接状态改变时,会触发连接状态改变事件。

您可能想查看这篇文章。

https://msdn.microsoft.com/en-us/library/aa326268(v=vs.71).aspx

【讨论】:

不确定它与visual studio有什么关系,另外如果你看帖子,它里面有connectionState...【参考方案6】:

我正在使用@Ramesh Durai 的解决方案,但发现至少在我的设置中(应用程序启动后定期调用/测试应用程序;使用带有 Sql Server 2012 数据库的 .Net 3.5)第一次调用 IsConnected() 之后使数据库脱机返回true。但是,它在下面的 ExecuteScalar() 行中抛出了预期的异常:

public bool IsConnected() 
    using (var conn = new SqlConnection(DBConnection.ConnectionString)) 
        using (var cmd = New SqlCommand("SELECT 1", conn)) 
            try 
                conn.Open();
                cmd.ExecuteScalar();
                return true;
             catch (SqlException) 
                return false;
            
        
    

【讨论】:

【参考方案7】:

此代码用于 mysql

public class Program

string connection = "SERVER=localhost; user id=root; password=; database=dbname";
private void Form1_Load(object sender, System.EventArgs e)

checkifconnected();


private void checkifconnected()

MySqlConnection connect = new MySqlConnection(connection);
try
connect.Open();
MessageBox.Show("Database connected");

catch

MessageBox.Show("you are not connected to database");



public static void Main()




【讨论】:

以上是关于如何检查数据库可用性的主要内容,如果未能解决你的问题,请参考以下文章

如何在其他四个数据框的列中检查一个数据框列是不是可用?

如何使用协程在android中每1秒检查一次GPS可用性

Swift - 我如何检查 firebase 服务器是不是可用?

即使设备连接到 Wifi 或移动数据,也要检查互联网可用性 [重复]

如何检查 Access 数据库中的 CheckEdit?

ATP检查规则如何确定?