代码之家  ›  专栏  ›  技术社区  ›  Russ

如何检查SQL Server是否处于活动状态?

  •  1
  • Russ  · 技术社区  · 15 年前

    我有一个方法来检查并确保我的SQL Server处于联机状态,我在代码的某些连接敏感部分中使用它。

    虽然它工作正常,但我注意到运行起来需要20毫秒,我想知道是否有人知道一种更好的方法来检查SQL Server,以确保它正常运行。

    这是我现有的代码。

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
            public static bool IsSqlServerOnline(string connectionString)
            {
    #if DEBUG || DEBUG_SINGLE_CORE
                Stopwatch sw = new Stopwatch();
                sw.Start();
    #endif
    
    #if DEBUG || DEBUG_SINGLE_CORE
                // This sould only occur of we are in the VSTS designer
                if (string.IsNullOrEmpty(connectionString))
                {
                    return false;
                }
    #endif
    
                if ( !NetworkInterface.GetIsNetworkAvailable() )
                {
                    return false;
                }
    
                if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString");
    
                bool isSqlServerOnline = false;
                SqlConnectionStringBuilder conString = new SqlConnectionStringBuilder(connectionString);
    
                try
                {
                    using (Ping p = new Ping())
                    {
                        string sqlSvr = conString.DataSource;
                        if (sqlSvr != null)
                            isSqlServerOnline = p.Send(sqlSvr).Status == IPStatus.Success;
                    }
                }
                catch (PingException)
                {
                    isSqlServerOnline = false;
                }
    
                if ( isSqlServerOnline )
                {
                    try 
                    {
                        conString.ConnectTimeout = 3;
                        using (SqlConnection conn = new SqlConnection(conString.ToString()))
                        {
                            conn.Open();
                            isSqlServerOnline = true;
                        }
                    }
                    catch ( Exception )
                    {
                        isSqlServerOnline = false;
                    }
                }
    
    #if DEBUG || DEBUG_SINGLE_CORE
                sw.Stop();
                Trace.WriteLine(string.Format("IsSqlServerOnline: {0}", sw.ElapsedMilliseconds));
    #endif
                return isSqlServerOnline;
            }
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Chris    15 年前

    正如其他人提到的,20毫秒的屏障可能不是什么值得担心的。但是,我可能会问代码多久被调用一次?将呼叫结果缓存3-5秒(甚至仅2-3秒)是否足够?而不是每次都访问网络?2-3秒是一个很小的缓存窗口,没有什么可以说“服务器活动”检查不能返回OK,只是让服务器在代码执行过程中崩溃。如果你每几秒钟浪费20毫秒(最多),那就没什么好担心的了。

        2
  •  2
  •   etoisarobot    15 年前

    您的代码检查您是否能够建立到SQL Server的连接。 您也可能有兴趣更进一步,并通过运行类似

    Select @@version
    
        3
  •  1
  •   Andomar    15 年前

    您可以使用Windows服务控制管理器API:

    1. 呼叫 OpenSCManager (以主机名作为参数)
    2. 呼叫 OpenService
    3. 呼叫 QueryServiceStatus

    如果状态为“服务运行”,则服务已启动。

    如果您不喜欢p/invoke,请看一下 System.ServiceProcess.ServiceController . 函数

    public ServiceController(string name, string machineName)
    

    看起来它可能用于检索特定服务的状态。