基本上我想知道在VB.NET 2005中是否使用sqlcommand然后使用NEW重用它是错误的。它会导致内存泄漏。
EG:
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
编辑:将try catch放入以避免关于不使用它们的评论
答案 0 :(得分:6)
只是为了扩展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
(编辑)就像一个FYI一样,使用自动包围try / finally的代码块,该代码块在创建它的变量上调用Dispose方法。因此,这是确保释放资源的简便方法。 http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx
答案 1 :(得分:2)
垃圾收集将在运行时收集第一个新的。
只有你故意在Finally块中处理的第二个。第一个将在下次运行垃圾收集时被处理掉。
我不认为这是个好主意。如果第一个命令未正确关闭,则可能会与数据库建立打开连接,并且不会被丢弃。
更好的方法是在完成第一个命令后再使用它,然后再重复使用它。
答案 2 :(得分:1)
呃,对所有那些说“没关系,不要担心,GC会处理它......”Dispose
模式的整个点的人来说处理GC 无法处理的那些资源。因此,如果一个对象有一个Dispose
方法,那么当你完成它时最好调用它!
总之,Longhorn213是正确的,请听他说。
答案 3 :(得分:1)
我从来没有做过的一件事 - 如果我有一个实施IDisposable
的课程,但我自己从未实际处理过,我只是将它留在GC周围,GC实际上会调用Dispose
对我来说?
答案 4 :(得分:0)
不,垃圾收集器会找到旧版本的mySql并在适当的时候解除分配。
垃圾收集器应该拾取任何已被解除引用的内容,只要它没有被移动到大对象堆中。
答案 5 :(得分:0)
虽然最终之后垃圾收集会清理,但是配置模式可以帮助系统更快地释放与该对象相关的任何资源,所以你应该在完成对象之前调用dispose重新分配。
答案 6 :(得分:0)
小心点。如果你必须在一个循环中做很多这些,它可能会很慢。只更新同一命令的.CommandText属性要好得多(同样,你可以稍微清理一下语法):
Using mysql as New SqlCommand(sSql, cnInput)
' do stuff'
mySql.CommandText = otherSql
'do other stuff'
End Using
当然,只有在第一个命令不再有效时才有效。如果您仍然在通过datareader,那么最好创建一个新命令。