我继承了一些这样的代码:
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 UsingASP.NET进程逐渐增长(超过1 GB),WinDBG显示堆上有OracleCommand对象(尽管没有我预期的那么多)。我认为OracleCommand可以保持对其他资源的控制,这会导致进程大小增加。
发布于 2012-07-16 21:29:23
Using用于在您使用对象后释放它,所以这不是问题所在。但是,using确实关闭了objDBCon连接。保持连接打开并在每次调用数据库时共享连接会更有效。因此,在这种情况下,我实际上会去掉使用for objDBCon,并将其拉出for循环,只需确保在所有db调用之后在循环外关闭它。
另外,我不确定这是不是直接从你的代码中复制过来的,我也不知道你的代码在做什么,但是100k对数据库的调用可能是它内存使用率如此之高的原因,并且会导致sql server上的高负载。
发布于 2012-07-16 21:29:52
我不认为这会导致内存泄漏,但事实上这会在一个循环中打开10万个连接(即使它们是池化的),我不认为看到如此大量的资源被消耗并不奇怪。
https://stackoverflow.com/questions/11504028
复制相似问题