2012-07-16 89 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