【问题标题】:ASP.NET Memory Leak - OracleCommandASP.NET 内存泄漏 - OracleCommand
【发布时间】:2012-07-16 12:11:20
【问题描述】:

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

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 可以保留会导致进程大小增长的其他资源。

【问题讨论】:

    标签: asp.net debugging windbg


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我以上面的代码为例。没有打开 100,000 个连接。
    • 好吧,我猜数据库连接不是问题。高内存仅在高负载期间发生然后下降还是持续蠕动?如果它蠕动,然后检查存储在静态变量和会话中的所有内容。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。连接未在循环中打开。我仅将其用于演示目的。我很难找到内存泄漏。 W2WP 流程的规模不断扩大。
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 2011-07-13
    • 2018-01-11
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多