我继承了一些类似的代码:
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可以保留其他可能导致流程大小增长的资源。
答案 0 :(得分:0)
Using
用于在完成对象后释放对象,因此不会出现问题。
但是,using
会关闭objDBCon
连接。保持该连接打开并与每次调用DB共享它更有效。因此,在这种情况下,我实际上将摆脱objDBCon
的使用并将其拉出for
循环,只需确保在所有数据库调用之后将其关闭在循环之外。
另外,我不确定这是否是代码中的直接副本,我不知道你的代码在做什么,但100k调用db可能是因为它的内存使用如此之高并且会导致在SQL Server上负载很高。
答案 1 :(得分:0)
我不认为这会导致内存泄漏,但事实是在循环中打开了10万个连接(即使它们被合并)我认为看到这么多资源被消耗是不奇怪的。< / p>