2012-07-16 1 views
0

나는 THS 같은 일부 코드 상속 :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 프로세스가 (GB 1 이상에) 점진적으로 성장하고 WinDBG로는 OracleCommand를 개체 (I 예상대로 생각만큼되지 않음) 힙에 있다는 것을 보여줍니다 . OracleCommand가 프로세스 크기를 증가시키는 다른 리소스를 보유 할 수 있다고 가정합니다.

답변

0

Using은 완료되면 개체를 해제하는 데 사용되므로 문제가되지 않습니다. usingobjDBCon 연결을 닫습니다. DB를 호출 할 때마다 연결을 열어 공유하는 것이 더 효율적입니다. 따라서이 경우 실제로는 objDBCon을 사용하여 제거하고 for 루프 외부로 가져 오면 모든 db 호출 후 루프 외부에서 닫아야합니다.

또한이 코드가 코드에서 직접 복사 된 것인지 확실하지 않고 코드가 수행하는 내용을 알 수 없지만 db에 대한 100k 호출은 아마도 메모리 사용이 높고 원인이되는 이유 일 수 있습니다 SQL Server에서 높은로드.

+0

감사합니다. 위의 코드를 예제로 사용했습니다. 열린 100,000 개의 conection은 없습니다. – w0051977

+0

글쎄, DB 연결이 문제가 아닌 것 같습니다. 높은 메모리가 높은로드 중에 만 발생하고 그 다음으로 내려가거나 지속적으로 크립합니까? 그때 크리프가 정적 변수와 세션에 저장된 모든 것을 확인하십시오. – zeal

0

메모리 누수가 발생할 것이라고 생각하지 않지만 루프에 100,000 개의 연결이 열리는 것은 사실입니다. 이러한 리소스가 소비되는 것을보고 이상하지는 않습니다.

+0

감사. 연결이 루프에서 열려 있지 않습니다. 데모 용으로 만 사용했습니다. 나는 메모리 누출을 찾으려고 애쓰는 데 정말로 어려움을 겪고있다. W2WP 프로세스는 크기가 커집니다. – w0051977