Как я могу проверить, жив ли SQL-сервер? - PullRequest
1 голос
/ 18 декабря 2009

У меня есть метод проверки и проверки того, что мой 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;
        }

Ответы [ 3 ]

2 голосов
/ 18 декабря 2009

Ваш код проверяет, можете ли вы установить соединение с SQL Server. Вы также можете быть заинтересованы в том, чтобы сделать еще один шаг вперед и убедиться, что он отвечает на запросы, выполнив что-то вроде

Select @@version
1 голос
/ 18 декабря 2009

Как уже упоминали другие, барьер 20 мс, вероятно, не о чем беспокоиться. Однако я могу спросить, как часто вызывается код? Будет ли достаточно кешировать результат звонка на 3-5 секунд (или даже на 2-3)? вместо доступа к сети каждый раз? 2-3 секунды - это довольно маленькое окно кеша, и нет ничего, что могло бы сказать, что проверка «сервер жив» не мог вернуть OK, только если сервер все равно зависал в процессе выполнения кода. Если все, что вы тратите, - это 20 мс каждые несколько секунд (самое большее), вряд ли о чем беспокоиться.

1 голос
/ 18 декабря 2009

Вы можете использовать API диспетчера управления службами Windows:

  1. Вызов OpenSCManager (с именем хоста в качестве параметра)
  2. Звоните OpenService
  3. Вызов QueryServiceStatus

Если статус SERVICE_RUNNING, служба работает.

Если вы не в P / Invoke, взгляните на System.ServiceProcess.ServiceController. Функция

public ServiceController(string name, string machineName)

похоже, что он может быть использован для получения статуса определенной службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...