如何检查数据库可用性

ome*_*fer 22 .net c# sql sql-server connection

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

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;
}
Run Code Online (Sandbox Code Playgroud)

和:

static public SqlConnection getNewCon()
{
    SqlConnection newCon = new SqlConnection();
    newCon.ConnectionString = DBConnection.ConnectionString; // m_con.ConnectionString;
    newCon.Open();
    return newCon;
}
Run Code Online (Sandbox Code Playgroud)

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

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

在那种情况下我该怎么办?

提前谢谢,奥梅尔

Ram*_*rai 46

你可以这样试试.

    public bool IsServerConnected()
    {
        using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString))
        {
            try
            {
                l_oConnection.Open();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Dus*_*gen 11

SqlConnectionSqlException当它无法连接到服务器时会抛出一个.

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

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

using(SqlConnection connection = GetConnection())
{
    if(connection.IsAvailable())
    {
        // Success
    }
}
Run Code Online (Sandbox Code Playgroud)


Cyr*_*don 9

您的代码似乎很好,但您确实需要使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Close因为你刚刚打开它,所以无需测试状态.
关于Broken国家的更多信息:

已断开与数据源的连接已断开.只有在打开连接后才会发生这种情况.可以关闭此状态下的连接,然后重新打开.(此值保留给产品的未来版本.)

所以真的,没必要测试.

Connecting如果您处于多线程上下文并且您的连接实例是共享的,则状态可能是catch.但这不是你的情况.