2016-06-07 2 views
0

내 설정은 MySql.Data.MySqlClient v6.9.8.0Microsoft.Practices.EnterpriseLibrary.Data v6.0.0입니다.Microsoft 엔터프라이즈 라이브러리와 MySQL 연결 풀링

프로그램은 장기간 실행중인 프로그램을 실행하고 요청을 처리하는 방식으로 작업을 수행합니다. 때로는 요청이 차례로 처리되는 경우가 있습니다. 그들 사이에는 몇 시간이 걸릴 것입니다. (. 모든 시간 -이 간헐적 문제입니다) :

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

내가 연결 문자열에 Pooling=true를 사용하여 시도했지만 그것은 나에게 많은 문제를 야기 여기

은 예입니다 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

, 나는 알고있다. 당신은해서는 안됩니다. 엔트 라이브 라이브러리를 사용할 때조차 나는 여분의 .Close 단계를 시도하여 확인합니다.

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