Как определить, что служба SQL Server полностью запущена и все базы данных подключены - PullRequest
3 голосов
/ 01 февраля 2010

На некоторых более медленных компьютерах, на которых работает наше приложение (которое находится в папке автозагрузки Windows), когда машина перезагружается и автоматически включается, служба SQL Server все еще находится в состоянии запуска, когда мое приложение запускается. (SqlServer 2005)

Для противодействия этому я проверил состояние службы (MSSQL $ idealsql) и дождался запуска службы.

Public Function isServiceRunning() As Boolean
    Dim theServices() As System.ServiceProcess.ServiceController
    Dim theservice As System.ServiceProcess.ServiceController
    theServices = System.ServiceProcess.ServiceController.GetServices
    Dim running As Boolean

    For Each theservice In theServices
        If String.Equals(theservice.ServiceName, mServiceName, StringComparison.OrdinalIgnoreCase) Then
            running = (theservice.Status = ServiceProcess.ServiceControllerStatus.Running)
            Exit For
        End If
    Next
    Return running
End Function

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

Обновление
Этот процесс используется только при запуске приложения.
Псевдокод.
Проверка работающей службы (этот процесс)
Проверка базы данных существует
false -> создать базу данных
true -> выполнить любые обновления, необходимые для структур и т. д.
Продолжить выполнение основной программы
Конец обновления

Затем мне нужно проверить наличие нашей базы данных (которая создается динамически, если ее нет), что я делаю, просматривая sysdatabase и обнаруживая, есть ли наша база данных, но еще раз, требуется некоторое время, прежде чем все базы данных будут действительно подключены.

Я также нашел дополнительный код, чтобы проверить создание TempDB и получить дату, когда он был создан, чтобы определить, когда служба подключилась к сети.

SELECT crdate AS StartTime FROM sys.sysdatabases WHERE name = 'tempdb'

Согласно EventVwr, TempDB - первая база данных, подключенная к сети.

Есть ли правильный способ определить, что SQLServer полностью подключен и все базы данных запущены?

Хотя показанный код VB.Net, я не слишком озабочен языком, более того, это просто правильный способ определить, полностью ли подключен сервер базы данных.

1 Ответ

1 голос
/ 01 февраля 2010

В отдельном потоке в вашем приложении опросите таблицу в вашей базе данных (скажем, каждые 10 секунд) с низким запросом ввода-вывода, таким как

SELECT 1 FROM Some Table

, завернутый в «соответствующую» обработку исключений.

На основе результата этого выбора (1 или NULL) поднимите свои пользовательские события .NET DBOnline и DBOffline соответственно.

В этой статье обсуждается еще один подход с использованием DMV (для SQL Server 2005 и более поздних версий): Как узнать, когда была запущена служба SQL Server

USE master
GO 

SELECT TOP 1        
    sample_ms AS Millisecond_Since_Start
FROM        
    sys.dm_io_virtual_file_stats(DB_ID(), NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...