ThreadAbortedException之后泄漏了MySql连接池

时间:2016-07-26 15:46:48

标签: c# mysql asp.net ado.net datareader

我更新了代码以简化代码

我遇到了一个在此代码之前从未发生过的奇怪问题(完美运行2年)。

我在多个IIS上运行MVC应用程序,并使用MySQL而不是C#代码。

查询表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查询,但来自reader模式的表(和数据)是B.两个表都驻留在相同的DB和Schema中。

还有其他人遇到过这类问题吗?我想听听任何有关调查的理论或建议。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

显然这是一个已知的问题,由MySql团队修复,更新驱动程序后一切都很好 enter image description here