1

我有一种方法可以检查并确保我的 SQL 服务器在线,我在代码的某些连接敏感部分中使用了该方法。

虽然它运行良好,但我注意到它需要 20 毫秒才能运行,我想知道是否有人知道检查 SQL 服务器以确保其启动和启动的更好方法。

这是我现有的代码。

[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;
        }
4

3 回答 3

2

您的代码检查您是否能够建立到 SQL Server 的连接。您可能也有兴趣更进一步,并通过运行类似的东西来验证它是否正在响应查询

Select @@version
于 2009-12-18T16:34:04.077 回答
1

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

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

如果状态为 SERVICE_RUNNING,则服务已启动。

如果您不熟悉 P/Invoke,请查看System.ServiceProcess.ServiceController. 功能

public ServiceController(string name, string machineName)

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

于 2009-12-18T16:15:09.790 回答
1

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

于 2009-12-18T16:33:38.477 回答