繁体   English   中英

C#中的ADODB泄漏内存

[英]ADODB in C# leaks memory

在我的应用程序中,我正在使用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 ,确保在完成后调用_conn

您是否考虑过使用MySql .Net Connector 鉴于这是一个专门用于连接MySql的托管库,因此不泄漏的可能性更大。 另外,我以前使用过它,但没有注意到它会泄漏内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM