c# - C# 中的 ADODB 内存泄漏

标签 c# memory-leaks adodb

在我的应用程序中,我使用 ADODB 来查询 MySQL 数据库。这一切进行得很顺利,但是,ADODB 似乎泄漏了大量内存。

我通过调用每个执行查询的 close 方法部分修复了它。
我通过对这个方法的 1000000 个查询进行基准测试发现:

public static int Execute(string query)
{
    Connect();
    object ret;
    lock (_conn)
        _conn.Execute(query, out ret, -1);
    return (int)ret;
}

大约 10000 次查询后,我的内存就用完了,速度非常快。

我认为是因为_conn.Execute,所以我将其更改为:

public static int Execute(string query)
{
    Connect();
    object ret;
    ADODB.Recordset rs;
    lock (_conn)
        rs = _conn.Execute(query, out ret, -1);
    rs.Close();
    return (int)ret;
}

现在,这似乎节省了很多,但在执行 100000 个查询后仍然泄漏了大约 80MB 的内存。

有谁知道如何阻止它泄漏内存,我不需要记录集。我有 3 个不同的函数,一个用于像这样执行,一个用于执行并返回包装在我自己的类中的记录集,一个用于执行并返回最后插入的 id,这对于 INSERT INTO 查询很有用。

那么,有人知道如何阻止泄漏吗?

编辑:

这是 Connect() 中的代码:

private static ADODB.Connection _conn = new ADODB.Connection();

public static bool Connected
{
    get { return _conn.State == 1; }
}

public static bool Connect()
{
    lock (_conn)
        if (!Connected) _conn.Open(Configuration.DB_ConnectionString, "", "", -1);
    return Connected;
}

最佳答案

当使用 .Net 中的 COM 时,您需要显式释放您使用过的 COM 对象的所有句柄,否则它们将永远保留在内存中。

System.Runtime.InteropServices.Marshal.ReleaseComObject( obj );

因此重写您的代码:

object ret;
ADODB.Recordset rs = null;

Connect();

try
{
    // Why the lock? Is your code sharing the same connection across threads?
    lock (_conn) 
        rs = _conn.Execute(query, out ret, -1);

    rs.Close();
}
finally
{
    if (rs != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject( rs );
}

return (int)ret;

您需要以相同的方式保护 _conn,确保在完成后调用 ReleaseComObject。

关于c# - C# 中的 ADODB 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206473/

相关文章:

c# - 让用户指定定时器时间?

c# - 何时使用 !() 或 != if not null

c# - 如何将标签的可见性属性绑定(bind)到多个RadioButton?

c++ - 当新表达式的参数子表达式抛出时释放内存

sql-server - ADODB 打开记录集失败/"Operation is not allowed when object is closed"

c# - 在 ASP.NET Core 2.2 MVC 中查看内联文件时不显示自定义文件名

visual-studio - visual studio vc++ 的静态代码内存泄漏检测

c++ - Debug模式下的内存泄漏

excel - 在 VBA 中将数组另存为制表符分隔的文本文件

excel - 如何在 VBA 中对记录集执行 SQL 查询?