2009-06-04 1 views
0

Предположим, у меня есть мое клиентское приложение, и он подключается к серверу MySQL. Фантастика. Я не реализую это как поток. Я просто использую класс MySQLConnection.Возможно ли создать событие и обработать его, если соединение с сервером MySQL будет потеряно?

А теперь предположим, что Джим, который действительно небрежно относится к офису, случайно перезагружает сервер MySQL, не спрашивая разрешения в первую очередь.

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

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

  • Осуществить подключение как нить и проверить его каждые х секунд (если это вообще возможно)
  • Создать и обработать событие, когда соединение падает (вид зависит от точки выше)
  • Может быть, есть событие, встроенный в библиотеку MySQL Connector, что я даже не в курсе
  • Некоторые другие мистические темные кода, что я не в курсе

Любая помощь очень высоко ценится.

Редактировать: На этот вопрос был дан ответ в комментариях. Спасибо за прочтение.

+1

Эндрю, я думаю, что сохранение соединения открытым является плохой практикой, вы должны открыть/закрыть для каждой операции – tekBlues

+0

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

+0

@tekBlues - иногда полезно поддерживать открытые соединения, если они очень заняты - по соображениям производительности. –

ответ

0

У меня есть «случайно связанное» приложение и столкнулось с этой проблемой. Мне нужно было знать, было ли у пользователя сетевое подключение, и если да, если у них есть VPN-соединение, которое позволит им подключаться к базе данных SQL Server. Я использовал таймер для ping сервера базы данных один раз в минуту, чтобы проверить его достижимость.

public NetworkStatus GetNetworkStatus() 
    { 
     NetworkStatus netStatus = new NetworkStatus(); 
     netStatus.NetworkAvailable = NetworkInterface.GetIsNetworkAvailable(); 

     try 
     { 
      if (netStatus.NetworkAvailable) 
      { 
       Ping p = new Ping(); 
       // Create a buffer of 32 bytes of data to be transmitted. 
       string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
       byte[] buffer = Encoding.ASCII.GetBytes(data); 
       PingReply reply = p.Send(DB_SERVER_NAME, 1200, buffer); 
       netStatus.PublisherPingSuccess = reply.Status == IPStatus.Success; 
      } 
     } 
     catch (Exception ex) 
     { 
      netStatus.PublisherPingSuccess = false; 
      netStatus.Error = ex; 
     } 
     return netStatus; 
    } 
Смежные вопросы