В данный момент я использую этот код, чтобы проверить, доступна ли база данных:
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?
Вы можете просто уменьшить время ожидания подключения. Проведите небольшое тестирование и посмотрите, насколько низко вы можете спуститься, оставаясь при этом надежным. Бьюсь об заклад, вы можете приблизиться к 500 мс.
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx
Да и нет.
Вы всегда можете отметить, какой порт слушает ваш сервер, а затем попытаться подключиться к нему напрямую через сокет. Затем, если вам это удастся, вы можете «предположить», что он в сети, но это может не зависеть от вашей сетевой среды. Однако это наиболее «пинговый» подход. Конечно, это может быть что-то еще, но это маловероятно в стандартной среде, где БД просто временно не работает.
Кроме того, если ваша БД находится на выделенном компьютере, вы можете на самом деле проверить связь с ней. Но это будет проверять только, работает ли машина, а не сервер БД.
Последним вариантом было бы, чтобы какой-нибудь фоновый сервер постоянно контролировал сервер БД, и когда он обнаруживает, что он отключен, он отмечает что-то соответствующим образом. Затем ваше приложение проверит эту вещь (фактически кеш), и это будет практически мгновенно. Конечно, это может означать, что он может давать ложноотрицательные результаты (т.е. сервер может быть в сети, но служба мониторинга еще не обновила кеш).