2016-07-26 67 views
-1

後,我爲了簡化它MySQL連接池泄露ThreadAbortedException

我遇到一個奇怪的問題,從來沒有在此代碼之前發生的事情(2年完美運行)更新的代碼。

我在多個IIS上運行MVC應用程序,並通過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(); 
     } 
    } 

此代碼的結果是從讀取器架構中的SQL查詢表A,但表(和數據)乙。兩個表都駐留在同一個DB和Schema中。

有沒有其他人遇到這種類型的問題?我想聽聽任何有關調查的理論或建議。

+6

命令的MySqlConnection的實例後,你如何管理編譯這段代碼? – Steve

+0

@GSerg - 讀取器將在使用塊完成後處理。但值得一看的是這個方法的聲明,以及它是如何被調用的。 – Paddy

+0

我和@Tom一起工作,我想更新這個問題,我們發現由於某些特性(已刪除)我們有一個很長的進程運行,但是iis拋出了'ThreadAbortedException',因此在從'MySql'讀取數據時沒有嘗試捕獲,問題在於我們的連接池沒有同步,並且連接泄漏。 現在我們試圖瞭解這是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

因此很明顯,這是一個已知的問題,固定由MySQL團隊,更新驅動程序一切都很好,現在 enter image description here