2016-06-07 11 views
0

Mein Setup ist MySql.Data.MySqlClient v6.9.8.0 und Microsoft.Practices.EnterpriseLibrary.Data v6.0.0.Pooling von MySQL-Verbindungen mit der Microsoft Enterprise-Bibliothek

Das Programm ist ein lang laufendes Programm, das ständig auf Aufgaben wartet und dann den Job mit einer Art von Datenbankaktion ausführt (je nachdem, was die Anfrage war). Manchmal werden die Anfragen nacheinander ausgeführt, manchmal auch einige Stunden zwischen ihnen sein. (. Nicht die ganze Zeit - das ist zeitweise Probleme)

Ich habe versucht, Pooling=true in der Verbindungszeichenfolge verwenden, aber es macht mir eine Menge Probleme

Hier ist ein Beispiel:

[MySqlException (0x80004005): Authentication to host 'localhost' for user 'root' using method 'mysql_native_password' failed with message: Reading from the stream has failed.] 

Durch das Deaktivieren von pooling wird das Problem behoben, aber gleichzeitig werden die Abfragen langsamer, da Verbindungen nicht wiederverwendet werden können. Ich habe online gesucht und viele Leute haben das gleiche Problem und die einzige Lösung, die ich gefunden habe, ist Pooling=false, die ich lieber meiden würde. Hier

ist ein Beispiel für meine Abfrage-Code:

Database db = this.GetDatabase(databaseName); 

List<dynamic> results = new List<dynamic>(); 

// Run the sql query 
using (DbCommand dbCommand = db.GetSqlStringCommand(query)) 
{ 

    foreach (var parameter in inParameters) 
    { 
     db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2); 
    } 

    foreach (var parameter in outParameters) 
    { 
     db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2); 
    } 

    using (IDataReader dataReader = db.ExecuteReader(dbCommand)) 
    { 
     IDictionary<string, object> instance; 

     do 
     { 
      // Read each row 
      while (dataReader.Read()) 
      { 
       instance = new ExpandoObject() as IDictionary<string, object>; 

       // Populate the object on the fly with the data 
       for (int i = 0; i < dataReader.FieldCount; i++) 
       { 
        instance.Add(dataReader.GetName(i), dataReader[i]); 
       } 

       // Add the object to the results list 
       results.Add(instance); 
      } 
     } while (dataReader.NextResult()); 
    } 

    return results; 
} 

Irgendwelche Ideen?

+0

Welche EntLib.Data -> MySql "Adapter" verwenden Sie? http://entlibcontrib.codeplex.com/releases Ich sehe nicht einen EntLib 6 codiert. – granadaCoder

+0

Ich habe es installiert Nuget, das ist die Version, die für mich zeigt –

+0

Bitte melden Sie die nuget-Paket und Version. Suchen Sie einfach die Zeile in Ihrer Datei "packages.config". – granadaCoder

Antwort

1

Können Sie das versuchen? Ich weiß, ich weiß. using "using" sollte bedeuten, dass ich die dataReader.Close() -Methode nicht aufrufen muss ... aber ich mache es trotzdem. Ich habe auch den dr.Read-Block etwas verändert.

Dieser Typ spricht darüber.

http://www.joseguay.com/uncategorized/ensure-proper-closure-disposal-of-a-datareader

Ich weiß, ich weiß. Du solltest nicht müssen. Selbst wenn ich die Ent-Bibliothek benutze, mache ich einen zusätzlichen .Schließ-Schritt, um sicherzugehen.

Database db = this.GetDatabase(databaseName); 

List<dynamic> results = new List<dynamic>(); 

// Run the sql query 
using (DbCommand dbCommand = db.GetSqlStringCommand(query)) 
{ 

    foreach (var parameter in inParameters) 
    { 
     db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2); 
    } 

    foreach (var parameter in outParameters) 
    { 
     db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2); 
    } 

    using (IDataReader dataReader = db.ExecuteReader(dbCommand)) 
    { 
     IDictionary<string, object> instance; 

     while (dataReader.Read()) 
     { 
      instance = new ExpandoObject() as IDictionary<string, object>; 

      // Populate the object on the fly with the data 
      for (int i = 0; i < dataReader.FieldCount; i++) 
      { 
       instance.Add(dataReader.GetName(i), dataReader[i]); 
      } 

      // Add the object to the results list 
      results.Add(instance); 
     } 

     if (dataReader != null) 
     { 
      try 
      { 
       dataReader.Close(); 
      } 
      catch { } 
     }   

    } 

    return results; 
} 
+0

Ich werde es versuchen und lassen Sie es wissen, danke –

+0

Nur wenige Tage und es läuft immer noch wie ein Leckerbissen, danke !! –

+1

Die Faustregel ist, dass ... wenn Sie sehen, dass "die Verbindungen ausgehen" Probleme ... tun Sie alles in Ihrer Macht, um sie loszuwerden ..... unabhängig von der "Sie sollten nicht Ich muss keine Erklärungen im Internet-Land abgeben. – granadaCoder