问题描述
|
我为数据库构建了一个包装器DLL,为我的数据库提供了一个对象API层。我遇到的问题是,当我销毁对象时,VB.net中的垃圾收集器似乎并没有清理混乱。相对可以肯定的是,我已经做了一切清理对象的工作,包括在每个对象上实现IDispose接口以销毁所有对象。
当实例化对象时,事情变得很丑陋,我根据对象在数据库中的对应条目对数据库进行了读取并填充了对象。这很好,但是,当我迭代创建和销毁这些对象的1000个和1000个时,内存只会不断增加。
然后发生在我身上:是因为我在对象内部使用了共享的ODBC数据库引用,所以无法清理我的对象吗?尽管我尽了最大的努力,这还能使我的物体存活吗?
例如:(注意:clsSharedConfig.g_objDatabaseConn是一个共享的ODBCConnection实例)
Dim cmd As New OdbcCommand(\"SELECT * FROM FILES WHERE CID = \" & p_lngID,clsSharedConfig.g_objDatabaseConn)
Dim data As OdbcDataReader
Try
cmd.CommandType = CommandType.Text
data = cmd.ExecuteReader()
谁能提供我发生这种情况的任何其他原因?我不想在所有地方都使用GC.Collect语句来控制它!
谢谢,
安德鲁
解决方法
您必须关闭阅读器以释放资源。见下文
Private Sub CmdReaderSample(ByVal cn As OleDbConnection,ByVal strCmd As String)
Dim cmd As OleDbCommand = New OleDbCommand(strCmd,cn)
cmd.CommandType = CommandType.Text
Dim objReader As OleDbDataReader = cmd.ExecuteReader
Try
\'read some stuff objReader.Read()
Finally
objReader.Close()
End Try
End Sub
还要检查何时从阅读器加载对象,您也可能在其中保留引用。
通过使用内存分析器(如Ants内存分析器)可以更好地解决内存泄漏
, 您是否尝试过每次实例化一个新的连接对象? .net框架将在后台处理实际的连接池,因此我不确定尝试共享该对象是否可以帮助您。
, 所以,我尝试了您的建议(感谢顺便说一句!),可惜,没有变化...
然后,只是为了幼稚,我在寻找DLL的应用程序设置。我注意到由于某种愚蠢/未知的原因,我打开了COM兼容性。
因此,我取消了这一要求,但前提是我不需要COM兼容性,而这只是在寻找解决方案时遇到了麻烦。一旦我做完,我就重新运行它,内存泄漏就消失了!
认真吗那是IT吗?我需要某人慢慢地对我说那个,也许是用木偶。
内存分析器确认我的泄漏存在于非托管内存中。
那是2天我没有回来...
安德鲁