【问题标题】:What's the fastest method to check SQL server availability?检查 SQL 服务器可用性的最快方法是什么?
【发布时间】:2011-03-16 11:38:56
【问题描述】:

检查 SQL 服务器是否存在的最佳方法是什么?

我正在尝试 Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion() 如果服务器存在且可用,它工作正常。 但是如果没有这样的服务器,它有点慢。

如果服务器存在,是否有足够快的方法进行检查,甚至无需定义用户凭据(仅服务器名称)?

你推荐使用什么?

【问题讨论】:

  • 这有什么用?什么情况下会部署一个不知道有没有数据库的数据库应用?
  • 我们真的需要知道响应缓慢的服务器在多大程度上被视为不可用。

标签: c# sql-server smo


【解决方案1】:

您仍然可以使用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion(),但可以异步使用它。例如您可以通过 BackWorker 类调用它。 DoWork 事件将调用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()。 RunWorkerCompleted 只会将布尔变量设置为 true。这样你就可以关闭它,等待多久,检查布尔值,如果它不是真的,那么你会知道 SQL 服务器还没有响应,你可以取消 BackgroundWorker。

【讨论】:

    【解决方案2】:

    您可以只使用TcpClient 类来查询服务器并检查特定端口是否打开,可能是这样的:

    using System.Net;
    using System.Net.Sockets;
    
    public bool CheckServerAvailablity(string serverIPAddress, int port)
    {
      try
      {
        IPHostEntry ipHostEntry = Dns.Resolve(serverIPAddress);
        IPAddress ipAddress = ipHostEntry.AddressList[0];
    
        TcpClient TcpClient = new TcpClient();
        TcpClient.Connect(ipAddress , port);
        TcpClient.Close();
    
        return true;
      }
      catch
      {
        return false;
      }
    } 
    

    【讨论】:

    • 对我来说,这适用于默认实例,但对于非默认实例则失败。我找到了这个解决方案,它适用于所有情况:codeproject.com/Articles/612751/…
    【解决方案3】:

    您可以尝试打开一个连接到端口 1433(默认 sql 端口)的 tcp 套接字,并在很短的时间内查看它是否响应。

    这需要 SQL 服务器启用 TCP/IP 协议。

    【讨论】:

      【解决方案4】:

      要添加到 Mikael 的,您也可以先 ping 主机,因为如果服务器关闭,这将最快地响应。

      当然,这一切都假设您正试图通过 TCP/IP 访问远程服务器。

      【讨论】:

        【解决方案5】:

        使用 Ben Robinson 的答案后,我想出了这个,它对我很有用。 我使用连接字符串在 try 块中打开然后关闭连接,但是当我在 Windows 8.1 上运行时,从未捕获到异常并且程序崩溃了。

        public unsafe bool OdbcConnectionTest(string sConnectionString
            , out int actualTimeMs)
        {
            DateTime dtme = DateTime.Now;
            OdbcConnectionStringBuilder con;
            Microsoft.SqlServer.Management.Smo.Server svr;
            Microsoft.SqlServer.Management.Common.ServerVersion sVer;
            Microsoft.SqlServer.Management.Smo.Database db;
            try
            {
                con = new System.Data.Odbc.OdbcConnectionStringBuilder(sConnectionString);
                object sServer;
                if (con.TryGetValue("server", out sServer))
                {
                    svr = new Microsoft.SqlServer.Management.Smo.Server((string)sServer);
                    if (svr != null)
                    {
                        sVer = svr.PingSqlServerVersion((string)sServer);
                        if (sVer != null)
                        {
                            object sDb;
                            if (con.TryGetValue("database", out sDb))
                            {
                                if (!String.IsNullOrWhiteSpace((string)sDb))
                                {
                                    db = svr.Databases[(string)sDb];
                                    if (db != null && db.IsAccessible)
                                    {
                                        TimeSpan ts = DateTime.Now - dtme;
                                        actualTimeMs = (int)ts.TotalMilliseconds;
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch 
            {
                actualTimeMs = -1;
                return false;
            }
            actualTimeMs = -1;
            return false;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-24
          • 2016-08-17
          • 1970-01-01
          • 1970-01-01
          • 2016-11-20
          • 2011-01-11
          • 1970-01-01
          相关资源
          最近更新 更多