【问题标题】:MySql Connection Pool leaked after ThreadAbortedExceptionThreadAborexception 后 MySql 连接池泄漏
【发布时间】:2016-11-30 08:56:14
【问题描述】:

我更新了代码以简化它

我在这段代码上遇到了一个以前从未发生过的奇怪问题(完美运行了 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();
        }
    }

此代码的结果是对表 A 的 sql 查询,但来自读取器架构的表(和数据)是 B。两个表都驻留在同一个数据库和架构中。

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

【问题讨论】:

  • command 是 MySqlConnection 的一个实例,你是如何编译这段代码的?
  • @GSerg - 阅读器将在 using 块完成后被释放。但值得看看 this 存在于其中的方法声明以及它是如何被调用的。
  • 我和@Tom 一起工作,我想更新这件事,我们发现由于某些功能(已删除),我们有一个很长的进程正在运行,但是 iis 已经抛出了ThreadAbortedException 因此没有尝试捕获在从MySql 读取数据时,我们的连接池没有同步,导致连接泄漏。现在我们正在尝试了解这是否是 MySql 驱动程序问题或其他问题。有什么想法吗?

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


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2012-06-14
      • 2021-12-23
      相关资源
      最近更新 更多