0

我继承了一些类似的代码:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim Test As Integer
                Dim strCon As String = "Data Source=TestDatabase;User Id=TestUser;Password=TestPassword;"
            For Test = 0 To 100000
            Dim objDBCon As New OracleConnection(strCon)
            Dim objDBCmd As New OracleCommand
            Dim objDR As OracleDataReader
            Using objDBCon
                'Using objDBCmd
                objDBCmd.Connection = objDBCon
                objDBCmd.CommandText = "SELECT * FROM nominal_incident where rownum = 1 "
                objDBCon.Open()
                objDR = objDBCmd.ExecuteReader
                'End Using

            End Using
        Next   
            Catch ex As Exception
              'Handle the exception.  It is not absorbed.
            End Try
        End Sub

这会导致内存泄漏吗?我希望看到如下 Using 语句:

Using objDBCmd

End Using

ASP.NET 进程逐渐增长(超过 1 GB),WinDBG 显示堆上有 OracleCommand 对象(尽管没有我预期的那么多)。我想 OracleCommand 可以保留会导致进程大小增长的其他资源。

4

2 回答 2

0

Using用于在完成后释放对象,因此这不是问题。但是using确实关闭了objDBCon连接。保持该连接打开并在每次调用数据库时共享它会更有效。所以在这种情况下,我实际上会摆脱使用 forobjDBCon并将其拉到for循环之外,只需确保在所有 db 调用之后将其关闭在循环之外。

另外,我不确定这是否是您的代码的直接副本,我无法判断您的代码在做什么,但是对 db 的 100k 调用可能是它的内存使用量如此之高并且会导致高负载的原因sql服务器。

于 2012-07-16T13:29:22.957 回答
0

我认为这不会导致内存泄漏,但是在循环中打开 10 万个连接的事实(即使它们是池化的)我认为看到如此大量的资源被消耗并不奇怪。

于 2012-07-16T13:29:52.133 回答