Есть ли в моем приложении ASP.NET простой способ программно определить, не работает ли сервер mysql db? - PullRequest
1 голос
/ 26 марта 2009

Я использую MySQL в своем приложении ASP.NET (с MySQL .NET Connector), есть ли способ программно проверить, не работает ли сервер БД? Я натолкнулся на MySQLConnection.Ping (), но, к сожалению, это не работает так, как должно (сначала нужно открыть соединение с помощью Open (), а также возвращает false, даже если сервер БД снова становится доступным). Единственное решение, которое я придумала, - это использование метода Open (), если это вызывает исключение, то сервер БД недоступен, есть ли более надежный способ сделать это? Я где-то читал, что использование Open () может не работать должным образом, если используется пул соединений, это может привести к возникновению исключения, даже если сервер БД работает.

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

В моем приложении я регистрирую все исключения (сначала я пытаюсь зарегистрировать их на сервере БД - это может быть тот же сервер БД, который выключен, но может и не быть, в зависимости от конфигурации - если это не удается, исключения регистрируются в текстовый файл). Теперь я хочу обработать случай, если сервер БД не работает, обычно происходит то, что исключения будут генерироваться почти при каждом запросе к моему приложению, это означает, что журнал будет заполнен этими исключениями, другая проблема заключается в Я буду продолжать предоставлять страницы с ошибками пользователям (или, другими словами, пользователи будут продолжать видеть страницы с ошибками при каждом обращении к приложению), что я хочу сделать, это если выдается исключение db (т.е. введите MySQLException), чтобы проверить, работает ли сервер БД, если нет, то измените какой-либо флаг в моем приложении и обслуживайте страницу, которая содержит что-то вроде приложения, временно недоступна (флаг проверяется в модуле httpModule и перенаправляет или передает на эту страницу) , Я также планирую сделать так, чтобы он отправлял мне SMS с использованием прокси-сервера SMS, чтобы я мог предпринять какое-либо действие, но это другая история, не связанная с этим вопросом.

Ответы [ 4 ]

2 голосов
/ 26 марта 2009
try {
    cmd.ExecuteNonQuery();
    // server is up
}
catch { 
    // server is down
}
0 голосов
/ 26 марта 2009

Может быть, вы могли бы попытаться соединиться с необработанным TcpClient, т.е. просто попробуйте подключиться и отключиться. Хотя это не решает вашу проблему с выдачей исключений.

try{
 TcpClient _socket = new TcpClient();
 _socket.Connect(host, port);
 _socket.Close();
}
catch (System.Net.Sockets.SocketException ex)
{
    if (ex.SocketErrorCode == System.Net.Sockets.SocketError.ConnectionRefused //Process down
        || ex.SocketErrorCode == System.Net.Sockets.SocketError.HostDown //Server turned off
        || ex.SocketErrorCode == System.Net.Sockets.SocketError.TimedOut //Not responding
       )
    {
      //=> offline mode
    }
}
0 голосов
/ 26 марта 2009

Решение, которое я видел, работает для чего-то подобного (технически мы подключались к базе данных SQL Server в C #, но, кратко использовав коннектор MySQL, я думаю, что они работают в основном одинаково), что у нас было единым место, где было создано и открыто соединение. В этом одном методе мы заключаем SQLException (MySQLException для вас) в специальное исключение «эй, база данных разорена». Затем в обработчике / регистраторе исключений вы можете просто проверить свое особое исключение и делать все, что вам нужно, когда база данных не работает.

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

0 голосов
/ 26 марта 2009

Мне нравится это решение .. http://forums.asp.net/p/1066040/1542583.aspx

Мое решение состоит в том, чтобы иметь два соединения. Один с очень коротким тайм-аут, который я использую для тестирования, и другой нормальный. Я сначала делаю фиктивный звонок на короткий перерыв. если это не удается, я показываю что-то это не из базы данных, в противном случае я продолжаю нормально. тот как пользователь не видит ошибку стр.

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

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