ADO.NET: Более быстрый способ проверить, доступен ли сервер базы данных?

В данный момент я использую этот код, чтобы проверить, доступна ли база данных:

public bool IsDatabaseOnline(string con)
{
    bool isConnected = false;
    SQLConnection connect = null;

    try {
        connect = new SQLConnection(con);
        connect.Open();
        isConnected = true;

    } catch (Exception e) {
        isConnected = false;

    } finally {
        if (connect != null)
            connect.Close();
    }

    return isConnected;
}

В то время как этот код хорошо работает, существует недостаток. Если сервер не онлайн, он проводит приблизительно 4 целых секунды, пытаясь открыть соединение прежде, чем решить, что это не доступно.

Существует ли способ протестировать соединение, не пробуя к фактическому открытию его и ожиданию тайм-аута? Что-то как эквивалентный базе данных из ping?

5
задан Noon Silk 4 May 2010 в 00:22
поделиться

2 ответа

Вы можете просто уменьшить время ожидания подключения. Проведите небольшое тестирование и посмотрите, насколько низко вы можете спуститься, оставаясь при этом надежным. Бьюсь об заклад, вы можете приблизиться к 500 мс.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

3
ответ дан 15 December 2019 в 06:19
поделиться

Да и нет.

Вы всегда можете отметить, какой порт слушает ваш сервер, а затем попытаться подключиться к нему напрямую через сокет. Затем, если вам это удастся, вы можете «предположить», что он в сети, но это может не зависеть от вашей сетевой среды. Однако это наиболее «пинговый» подход. Конечно, это может быть что-то еще, но это маловероятно в стандартной среде, где БД просто временно не работает.

Кроме того, если ваша БД находится на выделенном компьютере, вы можете на самом деле проверить связь с ней. Но это будет проверять только, работает ли машина, а не сервер БД.

Последним вариантом было бы, чтобы какой-нибудь фоновый сервер постоянно контролировал сервер БД, и когда он обнаруживает, что он отключен, он отмечает что-то соответствующим образом. Затем ваше приложение проверит эту вещь (фактически кеш), и это будет практически мгновенно. Конечно, это может означать, что он может давать ложноотрицательные результаты (т.е. сервер может быть в сети, но служба мониторинга еще не обновила кеш).

-2
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: