2017-04-17 3 views
1

Ich möchte Verbindungsstatus zu MySql-Datenbank erkennen. Meine Datenbank wird auf einem anderen Server als meiner App bereitgestellt, und es bestehen gute Chancen, die Verbindung zu ihr über das Netzwerk zu verlieren. Also muss ich dieses Szenario in Betracht ziehen.Handle Verbindung zu MySql verloren

Hier ist, was ich bisher versucht (ein vereinfachtes Testbeispiel):

static string connectionString = "***"; 
public static MySqlConnection Connection; 
static System.Timers.Timer _timer; 

static void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    try 
    { 
     if (Connection.State != System.Data.ConnectionState.Open) 
      Connection.Open(); 
     // Call method to invoke MySqlCommand.ExecuteNonQuery 
     mysqlCommand.ExecuteNonQuery(); 
    } 
    catch (MySqlException ex) 
    { 
     Console.WriteLine("SQL EXCEPTION: " + ex); 
     // Handle all type of database exceptions 
     switch(ex.Number) 
     {...} 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("OTHER EXCEPTION: " + ex); 
    } 
} 

static void Main(string[] args) 
{ 
    Connection = new MySqlConnection(connectionString); 

    _timer = new System.Timers.Timer(3000); 
    _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); 
    _timer.Enabled = true; 

    Console.ReadKey(); 
} 

Wenn die Verbindung zum MySql verloren geht, habe ich eine allgemeine Ausnahme:

IOException: Kann nicht schreiben Daten zur Transportverbindung: Eine eingerichtete Verbindung wurde von der Software in Ihrem Rechner abgebrochen.

Ich habe erwartet, dass MySqlException gefeuert werden, aber das war nicht der Fall. Auch wenn die Verbindung zu MySql wiederhergestellt wird, bekomme ich immer noch die IOException statt die Abfrage auszuführen. Scheint wie, MySqlConnection Objekt wurde nicht aktualisiert und es ist nicht wichtig, neue Verbindungsstatus.

  1. Was ist der beste Weg, Verbindung verlorene Ausnahme zu behandeln?
  2. Wie kann ich MySqlConnection aktualisieren, wenn die Verbindung wiederhergestellt wird?

Hinweis:, dass ich nicht ein neues MySqlConnection Objekt für jede neue Abfrage instanziieren kann, weil das Programm, das ich MySqlConnection hat eine Singleton von Typ zu ändern bin versucht, die nur einmal initialisiert wird. Ich weiß, das ist ein schlechtes Design, aber ich möchte dieses Design jetzt nicht ändern. Ich möchte nur Verbindung verlorene Ausnahme fangen und versuchen, MySqlConnection zu aktualisieren, um weiterhin ordnungsgemäß zu funktionieren.

Antwort

0

Wenn Ihre MySqlConnection-Instanz die Verbindung zu Ihrem MySQL-Server verliert, können Sie nicht erwarten, dass die Verbindung der Instanzen automatisch oder anderweitig wiederhergestellt wird.

Sie müssen versuchen, die Verbindung mit einer neuen Instanz von MySqlConnection wiederherzustellen. Derjenige, der die Verbindung verloren hat, befindet sich jetzt in einem Terminalstatus und kann nicht wiederverwendet werden.

Um dies zu tun, ich nehme an, Sie so etwas wie diese

... 
    catch (MySqlException ex) 
    { 
    if (/*ex is a connection drop */) { 
     Connection?.Dispose(); 
     Connection = new MySqlConnection(...); 
     Connection.ConnectionString = /* your connection string */; 
     Connection.Open(); 
    } 
    else { 
     throw; 
    } 
    } 

Sie sind richtig tun könnten, dass Ihr Design einen Fehler hat. Ob dein Fehler fatal ist oder nicht, ist schwer zu sagen, ohne zu testen.

Diese Verbindungsinstanzen sind nicht threadsicher oder in irgendeiner Weise reentrant. Wenn Sie einen in einem Timer-Handler oder -Thread verwenden, können Sie in diesem Kontext nur verwenden. Andernfalls, wenn es bereits verwendet wird, wenn Ihr Timer oder Thread aufgerufen wird, wird es brenzlig. Wenn Sie Glück haben, erhalten Sie eine Ausnahme. Wenn Sie weniger Glück haben, erhält Ihr MySQL-Server von Ihrem Client Kauderwelsch und erkennt es. Wenn Sie noch weniger Glück haben, werden Ihre Daten durcheinander gebracht.

ADO.NET und die MySqlConnection object implement connection pooling. Das ist wichtig, weil es Verbindungen öffnet, verwendet und dann schließt, viel billiger, als Sie vielleicht erwartet haben.

Manchmal löscht MySQL Verbindungen, die Ihre Programme für längere Zeit offen gehalten haben. Dieser Beitrag kann helfen, wenn das Ihr Problem ist. How can I change the default Mysql connection timeout when connecting through python?

+0

Also meine einzige Option hier ist mein Design zu ändern und neue "MySqlConnection" -Instanz für jede Datenbankinteraktion zu erstellen? – Mhd

Verwandte Themen