2016-07-26 30 views
-1

ich den Code aktualisiert, um zu vereinfachen esMySql Connection Pool sickerte nach ThreadAbortedException

ich ein seltsames Problem gestoßen sind, die auf diesem Code noch nie passiert (perfekt für 2 Jahre laufen).

Ich verwende MVC-Anwendung über mehrere IIS und MySQL über C# -Code.

Abfrage Tabelle X empfängt Antwort von einer anderen Tabelle in demselben Schema.

Das Problem tritt sporadisch auf einigen IIS (einmal 1-4 Tage) und gelöst von 3 iisreset. Hier

ist der Code Ich verwende (aktualisiert):

using (var conn = new MySqlConnection(connectionString)) 
     { 
      var command = conn.CreateCommand(); 
      command.CommandText = sql; 

      IDataReader reader; 
      try 
      { 
       reader = command.ExecuteReader(); 
      } 
      catch (Exception ex) 
      { 
       throw new MoranbernateQueryException(sql, ex); 
      } 

      using (reader) 
      { 
       while (reader.Read()) 
       { 
        Console.WriteLine(sql, GetTableFromReader(reader)); 
       } 
      } 
     } 
    } 

    private static string GetTableFromReader(IDataReader reader) 
    { 
     var schema = reader.GetSchemaTable(); 
     var rows = schema?.Rows; 
     if (rows != null && schema.Columns.Count > 11) 
     { 
      return rows[0][10].ToString(); 
     } 
    } 

Das Ergebnis dieses Codes ist eine SQL-Abfrage auf Tabelle A, aber der Tisch (und Daten) von dem Leser Schema B Beide Tabellen befinden sich in derselben DB und demselben Schema.

Hat jemand anderes diese Art von Problem festgestellt? Ich würde gerne eine Theorie oder einen Vorschlag für eine Untersuchung hören.

+6

Befehl eine Instanz von MySqlConnection ist, wie Sie es schaffen, diesen Code zu kompilieren? – Steve

+0

@GSerg - Leser wird nach Beendigung des Verwendungsblocks entsorgt. Aber es wäre sehenswert, dass diese Methode darin lebt und wie sie heißt. – Paddy

+0

Ich arbeite mit @Tom und ich möchte aktualisieren, wir fanden, dass wir einen langen Prozess wegen einer Funktion ausgeführt hatten (entfernt), aber ich hatte 'ThreadAbortedException' geworfen also kein Versuch zu fangen beim Lesen von Daten aus' MySql' Die Konsequenz war, dass unser Verbindungspool nicht synchronisiert wurde und wir Verbindungsverlust hatten. Jetzt versuchen wir zu verstehen, ob dies ein MySql-Treiberproblem oder etwas anderes ist. Irgendwelche Gedanken? – guyl

Antwort

1

ich weiß nicht, wie Sie auf Reader zugreifen, auch wenn es außerhalb des Geltungsbereichs ist, gibt es möglicherweise Probleme mit dem Fluss Ihres Codes. benutze unten Code ich denke, das muss funktionieren.

using(var command = new MySqlConnection(connectionString)) 
{ 
command.CommandText = sql; 

try 
    { 
    using(SqlDataReader reader = command.ExecuteReader()) 
    { 

     while (reader.Read()) 
      { 
       var t = new T(); 
       var i = 0; 

       foreach (var property in properties) 
       { 
        try 
        { 
         property.SetValue(t, reader.GetValue(i++)); 
        } 
        catch (Exception ex) 
        { 
         HandleSetValueException<T>(sql, parameters, reader, connection, ex); 
        } 
       } 
       yield return t; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new MoranbernateQueryException(sql, ex); 
    } 
} 
+0

Ich aktualisierte die Frage mit einfacheren Code –

0

So offensichtlich es ist ein bekanntes Problem, das von MySql Team festgelegt wurde, nachdem die Aktualisierung des Treibers alles gut für jetzt ist enter image description here