-4

请看下面的代码,这是我作为测试编写的。它不会使 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 那么这会随着时间的推移导致内存泄漏吗?

4

1 回答 1

1

如果一个类有一个没有被调用的 Dispose 方法,那么它很可能是内存泄漏的来源。使用 Using,它会为你调用 Dispose 方法。

您的第二个示例应如下所示,其中所有一次性对象都包裹在 using 块中。

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
于 2012-11-11T18:58:26.650 回答