2012-07-16 51 views
0

我继承喜欢的部份一些代码:ASP.NET内存泄漏 - 的OracleCommand

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 objDBCmd 

End Using 

ASP.NET进程逐步增长(超过1 GB)和WinDBG中显示,有对象的OracleCommand在堆(尽管没有像很多如我所料) 。我认为OracleCommand可以保留其他资源,这些资源会导致进程的规模增长。

回答

0

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

此外,我不确定这是否是从您的代码的直接副本,我不能告诉你的代码在做什么,但对数据库的100K调用可能是为什么它的内存使用如此之高,并会导致SQL服务器上的高负载。

+0

谢谢。我用上面的代码作为例子。没有打开100,000个连接。 – w0051977 2012-07-16 14:42:13

+0

好吧,我猜数据库连接不是问题。高记忆力仅在高负荷时发生,然后下降或持续蠕动?如果它蠕变,然后检查存储在静态变量和会话中的所有内容。 – zeal 2012-07-16 16:35:28

0

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

+0

谢谢。连接没有在循环中打开。我仅用于演示目的。我真的很难找到内存泄漏。 W2WP工艺的规模逐渐扩大。 – w0051977 2012-07-16 13:45:43