在我的应用程序中,我使用 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/