DataTable内存泄漏

时间:2011-10-05 12:00:22

标签: c# .net ado.net memory-leaks datatable

即使数据库没有返回数据,下面的代码也会泄漏内存。任何人都可以对此有所了解。 .net profiler应用程序显示罪魁祸首是数据表

using (OleDbDataAdapter da = new OleDbDataAdapter("select * from external_message where status='P' and pendingthread=" + Thread.CurrentThread.ManagedThreadId, conn))
                {
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    if (dt.Rows.Count > 0)
                    {
                        DataRow dr = dt.Rows[0];
                        NotificationService.Logger.Write(Logger.RdvLogLevel.Debug, (uint)Thread.CurrentThread.ManagedThreadId, "GetInputs", "Received Message Id {0} Type {1}", dr["MessageId"].ToString(), dr.Field<string>("TargetType"));
                        return new DatabaseItem { connection = conn, dataRow = dr };
                    }
                    else
                    {
                        dt.Dispose();
                    }
                }

3 个答案:

答案 0 :(得分:4)

可能在线下导致内存泄漏。您必须处理包含一些非托管数据的数据库连接。

return new DatabaseItem { connection = conn, dataRow = dr };

如果即使没有数据返回也会泄漏内存,请确保弃置conn?总是你必须处理数据库连接。

答案 1 :(得分:0)

我不认为这是泄密。这些对象将消耗资源,直到它们被垃圾收集。你的dt.Dispose()将向垃圾收集器提供一个提示,告知你不再需要你的对象,但.Net不会清理它直到感觉就好了。

您可以通过调用GC.Collect()来提示垃圾收集器运行,但通常您应该让.Net自行清理。

答案 2 :(得分:0)

主要功能上的

[STAThread]导致问题。删除它,现在一切正常。