[英]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.