문제

본질적으로 VB.NET 2005에서 sqlcommand를 사용한 다음 NEW를 사용하여 재사용하는 것이 잘못된 것인지 알고 싶습니다.메모리 누수가 발생합니까?

예:

try

dim mySQL as new sqlcommand(sSQL, cnInput)

// do a sql execute and read the data 

mySQL = new sqlcommand(sSQLdifferent, cnInput)

// do sql execute and read the data
catch ...

finally

if mysql isnot nothing then
   mysql.dispose
   mysql = nothing
end if

편집하다:그것을 사용하지 않는다는 의견을 피하기 위해 잡으려고 노력하십시오.

도움이 되었습니까?

해결책

Longhorn213이 말한 내용을 확장하기 위해 이에 대한 코드는 다음과 같습니다.

Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
  ' do stuff'
End Using

Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
  ' do other stuff'
End Using

(편집) 참고로, using은 생성된 변수에 대해 Dispose 메서드를 호출하는 try/finally 주위의 코드 블록을 자동으로 래핑합니다.따라서 리소스가 해제되었는지 확인하는 쉬운 방법입니다. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

다른 팁

가비지 수집은 실행될 때 첫 번째 새 항목을 수집합니다.

finally 블록에는 의도적으로 두 번째 항목만 삭제됩니다.첫 번째 항목은 다음에 가비지 수집이 실행될 때 삭제됩니다.

나는 이것이 좋은 생각이라고 생각하지 않습니다.첫 번째 명령이 올바르게 닫히지 않으면 데이터베이스에 대한 연결이 열려 있을 수 있으며 삭제되지 않습니다.

더 좋은 방법은 사용을 마친 후 첫 번째 명령을 폐기하고 다시 사용하는 것입니다.

어, "괜찮습니다. 걱정하지 마세요. GC가 처리해 줄 테니..."라고 말하는 사람들에게 가리키다 ~의 Dispose 패턴은 GC에서 해당 리소스를 처리하는 것입니다. 캔트 을 없애다, 처리하다.따라서 객체에 Dispose 메서드를 사용하고 나면 호출하는 것이 좋습니다!

요약하면 Longhorn213이 맞습니다. 그의 말을 들어보세요.

내가 결코 해결하지 못한 한 가지 - 구현하는 클래스가 있는 경우 IDisposable, 하지만 실제로는 직접 폐기하지 않고 GC를 위해 그냥 놔둡니다. GC가 실제로 호출합니까? Dispose 나를 위한?

아니요, 가비지 수집기는 mySql의 이전 버전을 찾아서 적절한 시기에 할당을 취소합니다.

가비지 수집기는 대형 개체 힙으로 이동되지 않은 한 참조 취소된 모든 항목을 선택해야 합니다.

가비지 수집이 완료되면 정리됩니다. 결국 dispose 패턴은 시스템이 객체와 관련된 모든 리소스를 더 빨리 해제하는 데 도움이 되므로 객체 작업을 마친 후 객체에 다시 할당하기 전에 dispose를 호출해야 합니다.

조심하세요.루프에서 이러한 작업을 많이 수행해야 하면 속도가 느려질 수 있습니다.다음과 같이 동일한 명령의 .CommandText 속성을 업데이트하는 것이 훨씬 더 좋습니다. 또한 구문을 약간 정리할 수도 있습니다.

Using mysql as New SqlCommand(sSql, cnInput)
  ' do stuff'

    mySql.CommandText = otherSql

   'do other stuff'
End Using

물론 이는 첫 번째 명령이 더 이상 활성화되지 않은 경우에만 작동합니다.아직 데이터 리더를 사용하는 중이라면 새 명령을 만드는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top