请查看下面的代码,我将其作为测试编写。它不会使ASP.NET进程增长太多:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
Dim Test As Integer
For Test = 0 To 1000000
Test1()
Next
Dim Test2 As String = "Test"
Catch ex As Exception
End Try
End Sub
Public Sub Test1()
Try
Dim objCommand As New SqlCommand
Dim strConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True"
Dim objCon As New SqlConnection
objCon.ConnectionString = strConString
objCon.Open()
objCommand.Connection = objCon
objCommand.CommandText = "select * from person "
Dim objDR As SqlDataReader = objCommand.ExecuteReader
If objDR.HasRows Then
Using objCon
End Using
End If
Catch ex As Exception
'I don't swallow exceptions.
End Try
End Sub
End Class
我正在尝试检测内存泄漏。我在受影响的项目中找到了与上面类似的代码。我注意到没有调用objCommand.dispose。有问题的项目连接到Oracle数据库和SQL数据库。连接到SQL数据库时,使用上面的代码。连接到Oracle数据库时,使用Oracle.dataaccess.dll,代码看起来不同以反映这一点。
我的具体问题是:如果我避免调用sqlcommand.dispose那么这会导致内存泄漏吗?
答案 0 :(得分:1)
如果一个类有一个Dispose方法,那就不会被调用,那么它很可能是内存泄漏的来源。使用Using,它将为您调用Dispose方法。
您的第二个示例应如下所示,其中所有一次性对象都使用块包裹。
Dim strConString As String = "Data Source=IANSCOMPUTER;" +
"Initial Catalog=Test;Integrated Security=True"
Dim sqlStr as String = "select * from person "
Using objCon As New SqlConnection(strConString)
Using objCommand As New SqlCommand(sqlStr, objCon)
objCon.Open()
Using objDR As SqlDataReader = objCommand.ExecuteReader
If objDR.HasRows Then
End If
End Using
End Using
End Using