2016-06-07 9 views
0

Моя настройка MySql.Data.MySqlClient v6.9.8.0 и Microsoft.Practices.EnterpriseLibrary.Data v6.0.0.Объединение соединений MySQL с корпорацией Microsoft Enterprise

Программа представляет собой длинную программу, которая непрерывно выполняет прослушивание задач, а затем выполняет задание с использованием какой-либо формы базы данных (в зависимости от того, какой был запрос). Иногда запросы будут поодиночке, иногда между ними должно быть несколько часов. (. Не все время - это прерывистые проблемы)

Я попытался с помощью Pooling=true в строке соединения, но это вызывает у меня много проблем

Вот пример:

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

Отключение pooling устраняет проблему, но в то же время делает запросы медленнее, потому что мы не можем повторно использовать соединения. Я искал в Интернете, и у многих людей такая же проблема, и единственное исправление/обходное решение, которое я нашел, это Pooling=false, который я бы скорее избегал, если это было возможно.

Вот пример моего кода запроса:

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

Любые идеи?

+0

Какой адаптер EntLib.Data -> MySql "вы используете? http://entlibcontrib.codeplex.com/releases Я не вижу ни одного закодированного для EntLib 6. – granadaCoder

+0

Я установил его в форме Nuget, это версия, которая показывает мне –

+0

Просьба сообщить о пакете и версии nuget. Просто найдите строку в файле "packages.config". – granadaCoder

ответ

1

Вы можете попробовать это? Знаю, знаю. использование «using» должно означать, что мне не нужно вызывать метод dataReader.Close() ... но я все еще это делаю. Я также немного изменил блок dr.Read.

Этот парень говорит об этом.

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

Я знаю, я знаю. Вы не должны этого делать. Даже при использовании библиотеки Ent, я делаю дополнительный. Закрытый шаг, чтобы попытаться убедиться.

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

Я дам ему попробовать и дам вам знать, спасибо –

+0

Немногие дни, и он все еще работает как удовольствие, спасибо! –

+1

Правило большого пальца состоит в том, что ... если вы видите проблемы с запуском соединений ... делайте все, что в ваших силах, чтобы правильно избавиться от них ..... независимо от того, «вы должны «должны быть» декларации на интернет-земле. – granadaCoder