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