2011-10-05 73 views
3

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

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(); 
        } 
       } 

回答

0

Main函数上的[STAThread]导致问题。删除它,现在一切正常。 “

4

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

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

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

+0

”即使数据库没有返回数据,也会泄漏内存“。 – BrokenGlass

+0

@BrokenGlass:谢谢你指出。可能是因为没有调用conn.Dispose() – CharithJ

+0

连接在父方法中是关闭的。我只返回这个连接重用已经打开的连接。 –

0

我不认为这是泄漏。这些对象会在垃圾收集之前消耗资源。你的dt.Dispose()将向垃圾收集器提供一个提示,表明你的对象不再需要,但.Net将不会清理它,直到它感觉像。

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

+0

我有一个.net分析器应用程序。它会在每次调用gc时显示数据。内存不断增长,根引用不断增加。如果我评论上面的代码,这不会发生。 profiler显示在datatable的cosntructor中初始化的ReaderWriterLock的终结器被卡住,并且gc队列中有许多此类型的对象从未被收集。 –

+0

您是否尝试过在da.Fill中填充DataSet,然后获取生成的DataTable? –

+0

相同的代码在控制台应用程序中正常工作,但会泄漏内存窗口服务。请注意,此代码是在单独的线程中编写的 –