内存泄漏 - SQLCommand对象?

时间:2012-11-11 18:21:34

标签: asp.net vb.net memory-leaks

请查看下面的代码,我将其作为测试编写。它不会使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那么这会导致内存泄漏吗?

1 个答案:

答案 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