簡體   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