2016-06-07 2 views
0

Ma configuration est MySql.Data.MySqlClient v6.9.8.0 et Microsoft.Practices.EnterpriseLibrary.Data v6.0.0. Le programme est un programme de longue durée qui exécute en continu l'écoute des tâches, puis exécute le travail avec une certaine forme d'action de base de données (en fonction de ce que la demande était.) Parfois, les demandes seront l'une après l'autre, parfois il y aura être plusieurs heures entre eux. (. Pas tout le temps - ce sont des problèmes intermittents)Mise en pool des connexions MySQL avec Microsoft Enterprise Library

J'ai essayé d'utiliser Pooling=true dans la chaîne de connexion mais il me cause beaucoup de problèmes

Voici un exemple:

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

La désactivation de pooling résout le problème mais, en même temps, ralentit les requêtes car nous ne pouvons pas réutiliser les connexions. J'ai cherché en ligne et beaucoup de gens ont ce même problème et le seul correctif/solution de contournement que j'ai trouvé est Pooling=false que je préfère éviter si possible.

Voici un exemple de mon code de requête:

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; 
} 

Toutes les idées?

+0

Quel EntLib.Data -> MySql "adaptateur" utilisez-vous? http://entlibcontrib.codeplex.com/releases Je n'en vois pas codé EntLib 6. – granadaCoder

+0

Je l'ai installé sous forme de Nuget, c'est la version qui s'affiche pour moi –

+0

Veuillez rapporter le paquet et la version de nuget. Trouvez simplement la ligne dans votre fichier "packages.config". – granadaCoder

Répondre

1

Pouvez-vous essayer ça? Je sais je sais. utiliser "using" devrait signifier que je n'ai pas besoin d'appeler la méthode dataReader.Close() ... mais je le fais toujours. J'ai aussi légèrement modifié le bloc dr.Read.

Ce gars en parle.

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

Je sais, je sais. Tu ne devrais pas avoir à le faire. Même en utilisant la bibliothèque Ent, je fais un extra .Fermer l'étape pour essayer et s'assurer.

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

Je vais essayer et je vous le ferai savoir, merci –

+0

Quelques jours plus tard, il fonctionne toujours comme un régal, merci !! –

+1

La règle de base est que ... si vous voyez des problèmes de «panne de connexion» ...... faites tout ce qui est en votre pouvoir pour vous en débarrasser correctement ..... peu importe le «vous devriez 'T dois "des déclarations sur internet-land. – granadaCoder