2016-07-26 4 views
-1

후 나는 그것이MySQL의 연결은 풀 ThreadAbortedException

I (2 년 동안 완벽하게 실행)이 코드에 전에 이런 일이 없었는데 이상한 문제가 발생했습니다 단순화하기 위해 코드를 업데이트 유출.

MVC 응용 프로그램을 여러 IIS에서 실행 중이고 C# 코드를 통해 MySQL을 사용하고 있습니다.

쿼리 테이블 X는 동일한 스키마의 다른 테이블에서 응답을받습니다.

일부 IIS에서 문제가 산발적으로 발생하고 (1-4 일) 3 iisreset으로 해결됩니다.

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

이 코드의 결과는 독자 스키마에서 테이블 A에 대한 SQL 쿼리하지만 테이블 (데이터가) B입니다 : 여기

내가 사용하고 코드 ( 업데이트)입니다 두 테이블 모두 동일한 DB 및 스키마에 있습니다.

다른 누구도이 유형의 문제가 발생 했습니까? 조사에 대한 이론이나 제안을 듣고 싶습니다.

+6

명령은 MySqlConnection의 인스턴스 지금은 모두가 잘 드라이버를 업데이트 한 후, MySQL의 팀에 의해 고정 알려진 문제? – Steve

+0

@GSerg - 사용 블록이 완료되면 판독기가 폐기됩니다. 그러나 이것이 내재하고 어떻게 호출되는지에 대한 선언을 보는 것이 가치가 있습니다. – Paddy

+0

나는 @Tom과 함께 작업하며 문제에 대해 업데이트하고 싶습니다. 일부 기능 (제거됨)으로 인해 긴 프로세스를 실행했지만 'ThreadAbortedException'을 던져 버렸습니다. 따라서'MySql'에서 데이터를 읽는 동안 try catch가 발생하지 않습니다. 결론은 연결 풀이 동기화되지 않았고 연결 유출이 발생했기 때문입니다. 이제이 드라이버가 MySql 드라이버 문제인지 이해하려고합니다. 이견있는 사람 ? – guyl

답변

1

범위 밖에서도 독자에게 액세스하는 방법을 모르겠지만 코드 흐름에 문제가있을 수 있습니다. 아래 코드를 사용하면 이것이 효과가 있다고 생각합니다.

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

간단한 코드로 질문을 업데이트했습니다. –

0

그래서 분명히있어이 코드를 컴파일하고 관리 할 방법 enter image description here